PDA

View Full Version : سوال: فایل در سی++



hafez1
پنج شنبه 09 آذر 1391, 19:50 عصر
من یه فایلی دارم که یه سری اطلاعات توش ذخیره کردم و فایل رو روی دسکتاپ ذخیره کردم.
می خام بازش کنم و از اطلاعاتش استفاده کنم.
چجوری باید کدش کنم.

aidinMC
پنج شنبه 09 آذر 1391, 23:40 عصر
سی ++ یه کتاب خونه داره به اسمه fstream از این کتاب خونه استفاده کنید ، در مورد نحوه ی کار باهاش هم یه سرچ تو انجمن کنید راحت میتونید یاد بگیرید ، اگه باز به نتیجه نرسید بگید اگه کمکی از دستمون براومد در خدمتیم :)

Ananas
جمعه 10 آذر 1391, 01:07 صبح
http://www.cplusplus.com/reference/clibrary/cstdio/fread/
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/

hafez1
جمعه 10 آذر 1391, 09:05 صبح
http://www.cplusplus.com/reference/clibrary/cstdio/fread/
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/
این لینک هایی که گذاشتید رو سر زدم.توی اینا از fopen و pfile و... استفاده کرده.نمی دونم اینا ماله سی++ هست؟
من کار با این ها رو بلد نیستم اگه بخام از fstream که دوستمون بالا بهش اشاره کردن ببینید این کدی که پایین نوشتم باید بیاد و فایل رو باز کنه.
و وقتی بازش کرد ما باید بتونیم محتوای اون رو ببینیم درس می گم؟
ولی این کد چیزی به من نشون نمی ده.


// basic file operations
#include <iostream>
#include <fstream>
using namespace std;

int main () {
ifstream read;
read.open ("c:/file1.txt");

return 0;
}

برای استفاده از اطلاعات داخل فایل باید چی کار کنم؟

aidinMC
جمعه 10 آذر 1391, 10:15 صبح
بعد از این کدی که نوشتین اگر ما فرض کنیم تو فایلتون اعدادی بصورت زیر نوشتین و میخواین هر یک از اعداد رو تو یه متغیر قرار بدین به این شکل عمل کنید


اعداد داخل فایل

10 20 30 50 40 60

کد:

/*Farz kon mikhaii adad ro tu ye araye berizi*/

int arraye[6];

for (int i =0 ; i < 6 ;i++)
read >> array[i];



حالا اگه تو فایل رشته داری و میخوای خط به خط بخونی به صورت زیر عمل کن :


متون داخل فایل

hello word
what time is it ? : D


/*Baz ba farz in ke mikhaye berizi tu array*/
char arraye[2][300];
for (int i = 0 ; i < 2 ; i++)
read.getline(arraye[i],300); // in 300 mizan karakterhaye daryafti hastesh


اگه تو آرایه نریزی کار برات سخت میشه چون از حلقه for نمیتونی استفاده کنی و مجبوری خط به خط خودت کدها رو بنویسی

در آخر هم فایل رو حتما ببنید
read.close();

Ananas
جمعه 10 آذر 1391, 10:17 صبح
این لینک هایی که گذاشتید رو سر زدم.توی اینا از fopen و pfile و... استفاده کرده.نمی دونم اینا ماله سی++ هست؟
آره دیگه. اسم سایتشو ببینی نوشته cplusplus . مثال خوبیه. سایز فایل رو میسنجه و به اندازه ی اون یک بافر از حافظه میگیره و فایل رو روی اون بافر لود میکنه بعد هر چی بخواد از اون بافر می خونه که یک اشاره گر به ابتدای اون داره.

hafez1
جمعه 10 آذر 1391, 10:41 صبح
حالا اگه تو فایل رشته داری و میخوای خط به خط بخونی به صورت زیر عمل کن :



/*Baz ba farz in ke mikhaye berizi tu array*/
char arraye[2][300];
for (int i = 0 ; i < 2 ; i++)
read.getline(arraye[i],300); // in 300 mizan karakterhaye daryafti hastesh


اگه تو آرایه نریزی کار برات سخت میشه چون از حلقه for نمیتونی استفاده کنی و مجبوری خط به خط خودت کدها رو بنویسی

در آخر هم فایل رو حتما ببنید
read.close();
من توی فایلم 8 خط داده دارم که یه سری اسم وفامیلن خط اول اسمشه و خط دوم فامیلش باز خط سوم اسم نفر بد و خط 4 فامیلش تا ..........
حالا من می خام با اسما کار کنم.
ینی به یک در میان خطا نیاز دارم
این کدی که شما نوشتین اگه اشتبا نکنم یه آرایه می گیره و هر خط از فایل رو توی یه خونه از آرایه می ریزه.
درسه؟

aidinMC
جمعه 10 آذر 1391, 10:58 صبح
بله درسته همین کارو میکنه ، از رکورد استفاده کنید به اینصورت:

struct nam {
char name[50];
char lname[50];
}names[4];
/*hala be sorate zir dadeharo daryaft kon*/

for (int i = 0 ; i < 4 ; i++) {
read.getline(names[i].name,50);
read.getline(names[i].lname,50);
}
read.close();



البته یه پیشنهاد بهتر دارم بهتر اسم و فامیلی رو بصورت زیر تو فایل ذخیره کنید:



mohsen yegane
afshin azari
aidin MC

و به شکل زیر فراخوانی کنید



for (int i = 0 ; i < 4 ; i++)
read >> names[i].name >> names[i].lname;

hafez1
جمعه 10 آذر 1391, 11:09 صبح
ببخشیدgetline مال چه هدریه؟

aidinMC
جمعه 10 آذر 1391, 11:17 صبح
ببخشیدgetline مال چه هدریه؟
از متدهای fstream هستش.

hafez1
جمعه 10 آذر 1391, 11:31 صبح
من الان کل برنامم اینه:


#include <iostream>
#include <fstream>
using namespace std;
struct nam {
char name[50];
char lname[50];
}names[4];
int main () {

fstream read;
read.open ("c:/file1.txt");

/*hala be sorate zir dadeharo daryaft kon*/

for (int i = 0 ; i < 4 ;i++) {
read.getline(names[i].name,50);
read.getline(names[i].lname,50);
}
read.close();
for(int j=0;j<4;j++)
{
cout<<names[j]<<endl;
}

return 0;
}

ولی دقیقا این ارورو می ده
Error 1 error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'nam' (or there is no acceptable conversion)
چرا؟؟؟؟؟؟؟؟؟؟؟؟؟؟

aidinMC
جمعه 10 آذر 1391, 11:41 صبح
cout آخر اشتباه باید این شکلی بنویسید:

cout<<names[j].name << " " << names[j].lname <<endl;

hafez1
جمعه 10 آذر 1391, 11:50 صبح
واقعا ممنونم.جواب می ده.مرسی

hafez1
جمعه 10 آذر 1391, 12:25 عصر
اگه فایل ما تعداد خطهاش مشخص نباشه باید از دستور eof() استفاده کنیم ؟
بد آرایشو پویا بگیریم یا مثلا یه n بزرگ بش بدیم مثلا بدم100درسه؟

hafez1
جمعه 10 آذر 1391, 12:50 عصر
من این طوریش کردم جواب درست می ده ولی یه نگا بندازید چطوره؟


#include <iostream>
#include <fstream>


using namespace std;
struct nam {
char name[50];
char lname[50];
}names[100];
int main () {
int i=0;
fstream read;
read.open ("D:/Input1.txt");

/*hala be sorate zir dadeharo daryaft kon*/
if(!read) {
// file couldn't be opened
cerr << "Error" << endl;
// exit(1);
}
//while ( !read.eof() ) {
for ( i = 0 ; !read.eof() ;i++) {
read.getline(names[i].name,50);
read.getline(names[i].lname,50);
}
//}
int k=i;
read.close();
for(int j=0;j<k;j++)
{
cout<<names[j].name << " " <<endl;
}

return 0;
}

H_G_G_I
جمعه 10 آذر 1391, 14:25 عصر
من بیشتر از fopen , fread , fwrite استفااده می کنم !
می تونی مستقیم یه قسمتی از حافظه رو کپی کنی تو فایل !
این طوری هم سریع تر می شه هم خیلی حالش بیشتره :لبخندساده:
مثلا این ::

#include <iostream>

struct Sname
{
int age;
char name[4];
};

int main(int argc, char* argv[])
{
Sname names[8];

//write to file
if(std::cin.get() == 'w')
{
for(int i = 0; i < 8; i++)
{
names[i].age = i;
names[i].name[0] = 'a';
names[i].name[1] = 'b';
names[i].name[2] = 'c';
names[i].name[3] = '\0';
}

FILE* l_file = fopen("file.bin", "wb"); //ejade ye file jadid. wb == write binary
fwrite(&names, sizeof(Sname), 8, l_file);
fclose(l_file);
}
//read from file
else
{
FILE* l_file = fopen("file.bin", "rb"); //baz kardan file bara khondan. rb == read binary
fread(&names, sizeof(Sname), 8, l_file);
fclose(l_file);

for(int i = 0; i < 8; i++)
{
std::cout << names[i].age << '\t' << names[i].name << '\n';
}
}

system("PAUSE");
}

somayeh_shz
جمعه 24 آذر 1391, 21:32 عصر
سلام دوستان
من می خوام بخشی از داده هایی رو که داخل فایل هست رو بردارم مثلا از کاراکتر 4 تا 8 از کل فایل
مسئله اینجاست که اگه هر رکورد در یه سطر باشه
چه جوری سطر به سطر بخونم و داده ها رو از کاراکتر 4 تا 8 رو جدا کنم؟

aidinMC
جمعه 24 آذر 1391, 21:46 عصر
سلام دوستان
من می خوام بخشی از داده هایی رو که داخل فایل هست رو بردارم مثلا از کاراکتر 4 تا 8 از کل فایل
مسئله اینجاست که اگه هر رکورد در یه سطر باشه
چه جوری سطر به سطر بخونم و داده ها رو از کاراکتر 4 تا 8 رو جدا کنم؟

الان دقیق متوجه نشدم ، میخواین تو هر سطر از کاراکتر 4م تا 8م رو بخونید؟