PDA

View Full Version : نوشتن در فایل



pershianix
جمعه 10 اردیبهشت 1389, 22:50 عصر
من یه فایل نوشتم که یه سری اطلاعات دانشجو رو میخونه و اطلاعات جدیدو به فایل اضافه میکنه. حالا موقعی که میخوام اطلاعات موجود رو ویرایش کنم این مشکلو دارم:

وقتی اطلاعات موجود ویرایش میشه (مثلا کاربر شماره دانشجویی شو عوض میکنه) شماره ی دانشجویی جدید به آخر فایل اضافه میشه اما واسه حذف کردن شماره ی دانشجویی قبلی نمیدونم باید چیکار کنم.

خواستم از یه فایل کمکی استفاده کنم که کل اطلاعات جدیدو بریزم توی فایل جدید اما موضوع اینه که سری بعد که برنامه اجرا میشه، فایلی که واسه خوندن باز میشه همون فایل قبلیه و فایل جدید بلااستفاده میمونه.

ممنون میشم توی این مورد کمکم کنید.

SamaPic
شنبه 11 اردیبهشت 1389, 08:52 صبح
با سلام .
نام فایل را در داخل یک string قرار بدهید تا مشکلتان برطرف شود .
موفق باشید .

pershianix
شنبه 11 اردیبهشت 1389, 15:53 عصر
مثل اینکه متوجه منظورم نشدین. کسی میتونه کمک کنه؟

qwerty11
شنبه 11 اردیبهشت 1389, 16:23 عصر
باید تمام رکوردها رو از اول تا آخر دوباره تو فایل بنویسید ! البته ساختار فایهای دودویی رو زیاد یادم نمیاد چجوری بود اما برای فایل متنی باید تمام رکوردها رو دوباره بنویسید...

pershianix
شنبه 11 اردیبهشت 1389, 18:09 عصر
این کد من:






#include <iostream>
#include<fstream>
#include<istream>
#include <string>
using namespace std;
struct Student{
int id;
string a;
};
void main()
{
int r;
Student a;
ofstream fout("a.txt",ios::out|ios::app);
cout<<"How many student do you want to add?\n";
cin>>r;
for(int i=0 ; i<r; i++)
{
cout<<"shomare daneshjuee?\n";
cin>>a.id;
cout<<"name?";
cin>>a.a;
fout.write( reinterpret_cast< const char * >( &a ),sizeof( a ) );
cout<<"\n\n";
}
fout.close();
cout<<"*****************************************\n\n";
ifstream fin("a.txt", ios::in);
Student *es, t, z;///////////////
es = new Student [r+1];
cout<<"enter your ID and name: \n";
cin>>t.id>>t.a;
cout<<"******************************************\n\n";
for(int i=0; !fin.eof() ; i++)
{
fin.read(reinterpret_cast< char * >( &es[i] ),sizeof( es[i] ) );
if(t.id==es[i].id){
cout<<"\t\t enter your new id and name:";
cin>>z.id>>z.a;
es[i].id=z.id;
es[i].a=z.a;
}
cout<<es[i].id<<"\t"<<es[i].a<<endl;
}
fin.close();
ofstream ffout("a.txt",ios::out);
for(int j=0 ; j<r ; j++)
{
ffout.write( reinterpret_cast< const char * >( &es[j] ),sizeof( es[j] ) );
}
}

الان همه چی درست کار میده منهای اینا:

1: به جای نوشتن اطلاعات درست روی مانیتور، یه سری عدد (مقدار توی حافظه) روی مانیتور چاپ میشه.

2: واسه بار دوم که فایلو اجرا میکنم پیغام خطایابی صادر میشه و دیگه چیزی توی فایل نوشته نمیشه.

از اساتید خواهش میکنم حداقل توی این یکی مورد بهم کمک کنن. ممنون.

pershianix
یک شنبه 12 اردیبهشت 1389, 21:23 عصر
کسی کمک نمیکنه؟

pershianix
دوشنبه 13 اردیبهشت 1389, 12:30 عصر
من توی انجمن برنامه نویسی پست زدما!

pershianix
دوشنبه 13 اردیبهشت 1389, 15:21 عصر
مشکلم حل شد. فقط توی کد زیر

cout << "Enter ID: ";
cin >> info.id;
cin.get();
cout << "Enter Name: ";
cin.getline(info.name, 64);
fout.write( (char*)(&info), sizeof(Student) );

ممنن میشم بگید که چرا بعد از cin>>info.id از cin.get استفاده شده.

و اینکه میشه اون قسمت cast رو توضیح بدین؟ خط آخرو میگم. دقیقا چی به چی cast میشه؟ Student یه Struct هست و info هم یه Student
ممنون.

SamaPic
دوشنبه 13 اردیبهشت 1389, 23:13 عصر
با سلام خدمت شما دوست عزيز .



ممنون میشم بگید که چرا بعد از cin>>info.id از cin.get استفاده شده.توجه كنيد :
شما وقتي يك خط مانند روبرو وارد كنيد

ID : 12577865454

و سپس آن را از ورودي cin مي كنيد ( مي خوانيد ) . اين دستور تا NULL آخر ( آخر خط ) مي خواند .( يعني NULL را نمي خواند )
در واقع مطلب شما چنين نوشته مي شود :

ID : 12577865454\n

حال براي اينكه به خط بعدي برويم بايد يكبار NULL خوانده شود تا به خط بعدي برويم .
توجه داشته باشيد NULL = \n



و اینکه میشه اون قسمت cast رو توضیح بدین؟ خط آخرو میگم. دقیقا چی به چی cast میشه؟ Student یه Struct هست و info هم یه Student دستور


sizeof()

فقط تعداد بايت مورد استفاده براي متغيير student را برمي گرداند و نه چيز ديگري‌. ( پس يك عدد برمي گرداند . البته در اصل يك string برمي گرداند )
اميدوارم پاسخ خود را يافته باشيد .
موفق و پيروز باشيد .

pershianix
سه شنبه 14 اردیبهشت 1389, 07:26 صبح
ممنون. توی سایت cplusplus.com یه مطلب در مورد کستینگ خوندم و متوجه شدم چی به چی کست شده.