خواندن و نوشتن از فایل c++
در خیلی ازموارد نیاز هست تا اطلاعات داخل فایلی نوشته بشه و یکی از کارها هم طریقه دستیابی به فایل مورد نظر هست. در این پست نحوه ی دسترسی خواندن و نوشتن آموزش میدم.(در ویژوال استودیو)
برای شروع فرض کنید برنامه قراره اطلاعات رو روی یک فایل با نام test.txt در D:\data\001 رو بسازه و یا ویرایش کنه. اگر برنامه وقتی برای اولین بار بر روی سیستم احرا میشه قراره این فایل ها رو هم بسازه میریم به مرحله اول وگرنه از مرحله دوم شروع میکنیم!!!!
مرحله اول:
در ابتدا باید ببینید این فایل قراره کجا باشه یعنی آدرس فایل تا اگه نیاز هست فولدر مربوط ساخته بشه
به طور مثال میخواین در درایو D یک فولد به نام data و در اون ی فولدر به نام 001 بسازین از این دستور استفاده میکنیم:
system("md D:\\data\\001");
توجه داشته باشید در c++ برای آدرس دهی فایل ها باید از دو تا \ استفاده بشه. فاصله بین md و نام درایو هم مهمه.
اگر هم میخواین که نام درایو از متغییر دیگه ای گرفته بشه باید این رو بنویسید:
string a = "md ";
string temp = "D:\\data\\001";
a += temp;
system(a.c_str());
حالا نوبت میرسه به این که بررسی کنیم آیا فایل وجود داره یا خیر و اگر وجود نداره اون رو بسازیم
fstream file("D:\\data\\001\\test.txt");
if (!file.is_open())
{
file = fstream("D:\\data\\001\\test.txt", ios::out);
file.close();
}
else
file.close();
خط اول یک فایل رو با آدرسی که میگیره انتخاب میکنه. شرط if هم بررسی میکنه که آیا فایل وجود داره و یا نه، اگر وجود نداشت خط 4 اجرا میشه. در این خط با آرگومان ios::out به برنامه گفته میشه که در مسیر مشخص یک فایل رو بساز. سپس اون رو میبندیم با دستور close(). برای این میبندیم چون میخوایم اون اطلاعات رو بر حسب نیاز بخونیم و یا درج گنیم.
مرحله دوم:
اگر بخواهیم اطلاعاتی رو از فایل بخونیم باید بدونیم به چه شکلی ذخیره شدن. با توجه به این که شما هر چی داخل فایل بریزی، فایل نوع اون مثلا عدد بودن یا رشته بودن اون رو حفظ نمیکنه پس باید خودتون بدونید چی رو کجا ذخیره می کنید. مثلا اگر بخواهید نام، نام خانوادگی و شماره دانشجویی رو دخیره کنید باید با همین ترتیب هم بخونید.
حال، میخواهیم داخل فایل اطلاعاتی بریزیم(در ادامه به بحث خوندن از فایل برمیگردیم). اگر قصد داشته باشیم در انتهای فایل چیزی قرار بدیم :
fstream file;
file.open("D:\\data\\001\\test.txt", ios::app);
حالا فرض کنید بخواهید نام، نام خانوادگی و شماره دانشجویی رو دخیره کنید.توصیه میشه که این سه تارو توی یک سطر ذخیره کنیم و هر کدوم رو با یه کاراکتر از هم جدا کنیم مثل فاصله و یا @ و یا # و یا هرچی(البته همشون از فاصله بهترن)
int shomare = 1234567890;
string name = "ali";
string lastname = "ALI";
fstream file;
file.open("D:\\data\\001\\test.txt", ios::app);
file << shomare << "#";
file << name << "#";
file << lastname << "\n";
file.close();
فایل test.txt:
1234567890#ali#ALI
حالا برای خوندن اطلاعات به شکل زیر کد مینویسیم. توجه کنید دستور getline سه تا پارامتر میگیره. اولی فایل مورد نطر که قصد داریم بخونیم، دومی یک متغیر از نوع string و سومی یک کاراکتره که زمانی که سیستم اون رو از فایل بخونه دستور متوقف میشه. توجه کنید ما شماره رو با این که عدد بود با این دستور میخونیمش و بعد از اون با دستور stoi به یک عدد صحیح تبدیلش می کنیم. اگر چندین سطر داشته باشم یعنی چند دانشجو رو بخواهیم بخونیم دستورات زیر رو داخل
while (!file.eof())
قرار میدیم. دستورات زیر فقط برای خوندن یک سطره:
fstream file;
file.open("D:\\data\\001\\test.txt", ios::in);
string temp;
getline(file, temp, '#');
shomare = stoi(temp);
getline(file, name, '#');
getline(file, lastname, '#');
اگر هم میخوایم در جای مشخصی اطلاعات رو قرار بدیم باید فایل رو تا آخر بخونیم و اطلاعاتش رو داخل کلاس آرایه و یا هرچی قرار بدیم. بعد فایل رو پاک کنیم و از نو اطلاعات رو بریزیم.