کار با فایل های باینری در برنامه نویسی شی گرا

توابع کار با فایل ها در زبان سی پلاس پلاس

چند تابع مفید برای کار با فایل ها با زبان شی گرا سی پلاس پلاس؛

۱.تابع addItem برای نوشتن بر روی فایل (نوشتن یک شی)

fstream inFile,outFile;
template < class T>
void addItem(T myObj){

fstream outFile;
outFile.open("fileTest.txt",ios::out | ios::binary | ios::app );
outFile.write(reinterpret_cast<char *>(&myObj),sizeof(myObj));
outFile.close();
}

ios:app برای نوشتن در آخر فایل به کار می رود(با این روش فایل در زمان باز شدن خالی نمیشود)

ios::binary برای نوشتن بر روی فایل به صورت باینری استفاده میشود که کار با فایل را به مراتب آسان تر می سازد و به راحتی میتوانید فایل را بخوانید.

template برای تعریف یک نوع کلاس کلی به کار می رود که میتوانید هر  شی از هر نوع کلاسی را برای توابع نامبرده ارسال کنید.

۲.تابع خواندن از فایل

template <class T>
void readFile(T newObj)
{

fstream inFile;
inFile.open("nameFile.bin",ios::in | ios::binary);
if(!inFile.is_open())
   cout<<"error,can not open file.";
while(inFile.read(reinterpret_cast<char *>(&newObj),sizeof(newObj)))
      cout<<newObj;
inFile.close();
}

توضیح تابع ۲؛

با این تابع میتونید هر فایلی مطابق با یک کلاس رو بخونید.

روش کار این تابع به این صورته که یک فایل باینری که توسط سیستم نوشته شده رو باز میکنه ( باید توسط برنامه نوشته شده باشد نه دستی ) و در حلقه ی while با هر بار یک شی از درون این فایل رو میخونه!

به طور مثال یک کلاس تعریف میکنیم به صورت زیل

class Book{

         int ID;

         char name[10];

         char publisher[10];

         }

اندازه داده های کلاس Book برابر با ۲۴ بایت میشه.

پس هر بار که حلقه while در تابع فوق اجرا میشه ۲۴ بایت رو از فایل میخونه و اون ۲۴ بایتی رو که از فایل خونده برحسب اولویت و تعداد بایت در متغیر های مربوط قرار میگیرند.

همچنین نکته مهم اینجاست که در قطعه کد زیل

reinterpret_cast<char *>(&newObj)

هر بار که فایل رو میخونیم بایت های خونده شده در شِی newObj قرار میگیره و با سربارگزاری cout<<newObj چاپ میشه.

کد سربارگزاری برای یک کلاس دلخواه:

ostream& operator<<(ostream& out,Category myObj)
{
out<<"ID : "<<myObj.ID<<" "<<myObj.name<<endl;
return out;
}

اگر مشکلی یا سوالی داشتید در کامنت ها بپرسید.

نمایش نظرات (1)