PDA

View Full Version : سوال: چگونگی ذخیره شدن Structure در فایل



khafan_bat
دوشنبه 11 مرداد 1389, 11:16 صبح
خسته نباشید.

ببینید یک استراکچر داریم که در برنامه نقش یک واسط ( نخودی ) بین کاربر و فایل رو بازی میکنه . اطلاعات گرفته شده از کاربر در داده های این استراکچر ذخیره میشوند و توسط دستور write در فایل ذخیره میشوند. این وسط از نظر کار کردن کد هیچ مشکلی وجود نداره اما یک چیزی رو من خوب متوجه نمی شم و اون اینه که موقعی که رکورد رو توسط دستور read از فایل می خونیم چطور داده های استراکچر رو از هم تشخیص میده و مقدار رو در استراکچر از فایل جایگزین میکنه ؟ منظورم اینه که داده ها ی عضو یک استراکچر دقیقا چگونه در فایل ذخیره میشوند. ؟؟

نگاه کنید کد زیر کاملا کار میکنه اما ذهنم هنوز درگیره :

بهتر هست بگم که تابع read دقیقا چطور کار میکنه ؟؟؟؟ آیا هر کدام از فیلد ها رو در یک خط جدا مینویسه ؟ یا پیشت سر هم ؟



#include <iostream.h>
#include <conio.h>
#include <fstream.h>
#include <stdlib.h>

struct employee {
char name[21];
int hour;
int hp;
} emp;

int main()
{
clrscr();
int row=3;
ofstream fp1("emp.dat",ios::out | ios::binary);
if(!fp1) {
cout<<"Cannot Open file.";
getch();
exit(0);
}
cout<<"Name "
<<"Hour "
<<"Hour Pay";
cout<<"\n---------------------------------------------------------";

// Get data from user and save into file as a record.
while(1){
gotoxy(1,row);
cin>>emp.name;
if(!emp.name[0])
break;
gotoxy(20,row);
cin>>emp.hour;
gotoxy(30,row);
cin>>emp.hp;
fp1.write((char *) &emp,sizeof(struct employee));
row++;
}
fp1.close();

cout<<"\n\nPress a key to see output... ";
getch();
ifstream fp2("emp.dat",ios::in|ios::binary);
if(!fp2) {
cout<<"Cannot open file.";
getch();
exit(0);
}
clrscr();
cout<<"Name "
<<"Hour "
<<"Hour Pay "
<<"Salary";
cout<<"\n---------------------------------------------------------";
row=3;
while(fp2.read((char *) &emp,sizeof(struct employee)))
{
gotoxy(1,row);
cout<<emp.name;
gotoxy(20,row);
cout<<emp.hour;
gotoxy(31,row);
cout<<emp.hp;
gotoxy(45,row);
cout<<emp.hour*emp.hp;
row++;
}
fp2.close();
getch();
return 0;
}

tdkhakpur
دوشنبه 11 مرداد 1389, 13:22 عصر
بهتر هست بگم که تابع read دقیقا چطور کار میکنه ؟؟؟؟ آیا هر کدام از فیلد ها رو در یک خط جدا مینویسه ؟ یا پیشت سر هم ؟


از هر ابزاری برای ثبت داخل فایل استفاده کنید به ساختار بصوت تعدادی بایت با طول مشخص نگاه میکند نه چیز دیگر.
و ساختار شما به همان ترتیبی که نوشته شود به همان ترتیب هم خوانده میشود و این کار مربوط به کنترلر منبع ذخیره ساز هست که توسط freadو fwrite اجرا میشود.

PC2st
دوشنبه 11 مرداد 1389, 13:53 عصر
بهتر هست بگم که تابع read دقیقا چطور کار میکنه ؟؟؟؟ آیا هر کدام از فیلد ها رو در یک خط جدا مینویسه ؟ یا پیشت سر هم ؟پشت سر هم...
علاوه بر توضیحات دوستان، چونکه توابع write و read بترتیب برای نوشتن و خواندن داده‌ها بصورت قالب‌بندی‌نشده عمل می‌کنند. پس معلوم نیست که چه چیزی می‌خواهد نوشته یا خوانده شود، یک کاراکتر معمولی؟ یک عدد؟ یک رشتهٔ متن؟ چونکه همهٔ این مقادیر بصورت یک نوع char ذخیره می‌شوند (در استاندارد زبان، نوع char حداقل باید ۸ بیت باشد و در استاندارد جدید، دقیقا ۸ بیت است).
برای نوشتن و خواندن بصورت قالب‌بندی‌شده (یعنی همان formatted input and output) از عملگرهای << و >> از streamها استفاده کنید.

khafan_bat
دوشنبه 11 مرداد 1389, 15:20 عصر
بسیار بسیار ممنون . . . . آرایه استرینگ حواس من رو پرت کرده بود. چون فکر میکردم اگه نامی که کاربر وارد میکنه کمتر از 20 حرف باشه همونقدر خونه مصرف میشه که اینطور نیست همون 20 + 1 خونه هنگام تعریف استراکچر مصرف (گرفته) شده حالا چه همش پر بشه و چه همش پر نشه .

در توابع read , write هم به خاطر همین از sizeof استفاده شده دیگه .. !!

متوجه شدم . مرسی