PDA

View Full Version : چگونگی کاربرد فایل باینری



amir-yeketaz
جمعه 18 دی 1388, 19:12 عصر
سلام به همه ی برنامه نویسایه محترم سی
فرض کنید که ما یه ساختار ساختیم با این مشخصات

struct inf{
char fname[30],lname[30];
char state[30],city[30];
int money;
}a;

و بعد میخوایم که از توفایل باینری این ساختار رو بخونیم اونم با استفاده از تابع fread
فرض میکنیم یه فایل به نام fp از نوع باینری ساختیم (مثلا با پسوند .bin)
حالا من اینجوری fread کردم


fread(a.fname,sizeof(a),1,fp);
fread(a.lname,sizeof(a),1,fp);
fread(a.state,sizeof(a),1,fp);
fread(a.city,sizeof(a),1,fp);
fread(&a.money,sizeof(a),1,fp);
حالا میخوام بدونم این سبک استفاده از تابع fread درسته یانه یا میشه بهترم نوشت یا باید از تابع fseek استفاده کرد
لطفا راهنماییم کنید

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

fwrite(&a,sizeof(a),1,wr);



fwrite(a.fname,sizeof(a),1,wr);
fwrite(a.lname,sizeof(a),1,wr);
fwrite(a.state,sizeof(a),1,wr);
fwrite(a.city,sizeof(a),1,wr);
fwrite(&a.money,sizeof(a),1,wr);


کلا من یه خورده تو این فایل باینری و این که چرا نمیشه اطلاعته توشو مثه فایل های متنی دید مشکل دارم و زیادم ازش خوشم نمیاد ولی استادمون تو پروژه ای که داده گفته که از فایل باینری استفاده کنید
بازم ممنون از همه و از مدیران این سایت محشر

gh-reza
جمعه 18 دی 1388, 20:07 عصر
برای خواندن


fread(&a,sizeof(struct inf),1,fp)

برای اطلاعات بیشتر و مثال به آدرس زیر رجوع کنید یا به کتاب C جعفرنژاد نگاه کنید.
http://msdn.microsoft.com/en-us/library/kt0etdcs(VS.71).aspx

برای نوشتن


fwrite(&a,sizeof(struct inf),1,fp)

برای fwrite هم به آدرس زیر رجوع کنید
http://msdn.microsoft.com/en-us/library/h9t88zwz(VS.71).aspx

fseek هم برای تغییر اشاره گر فایل بکار میره و ربطی به ورود و خروج اطلاعات به و از فایل نداره

برای fseek به آدرس زیر رجوع کنید
http://msdn.microsoft.com/en-us/library/75yw9bf3(VS.71).aspx

amir-yeketaz
جمعه 18 دی 1388, 22:53 عصر
خوب پس هیچ فرقی بین این نوع که همه رو یک جا بخونیم با اون که یکی یکی بخونیم یا بنویسیم وجود نداره؟نه؟
خوب حالا سوال من اینه که چجوری میشه تو این فایل باینری اطلاعاتو وارد کرد تا کامپایلر بتونه داخل فیال باینری رو بخونه و عمل fwrite ساختارو یا هر چیزه دیگرو انجام بده
در واقع سوال اصلی من همینه
ممنون میشم اگه جوابمو کامل بدین

gh-reza
جمعه 18 دی 1388, 23:59 عصر
برای دو تابع fread و fwrite اصلا مهم نیس اطلاعات شما باینری باشه یا متن. و همینطور مهم نیست سختار باشه یانه. این دو تابع فقط بایت رو میشناسن. شما میگین به تعداد گفته شده در پارامتر دوم بایت و به تعداد گفته شده در پارامتر سوم بار اطلاعات رو از فایل (که هندل اون توی پارامتر چهارم داده شده) به متغیر پارامتر اول یا به عکس منتقل کن. عمل نوشتن یا خواندن در فایل هم از محل اشاره گر فایل انجام میشه. اگه شما چندتا ساختار رو از فایل بخونید، با fread کردن هر کدوم اشاره گر فایل هم به میزان بایتهای کپی شده به انتهای فایل میره و شما لازم نیس نگران این مطلب باشین. شما میتونین یه آرایه از ساختارهای رو تشکیل داده و براحتی توی یه حلقه for یکی یکی اطلاعات رو از فایل load کنید. در مورد نوشتن توی فایل هم همینطوره. اگه یوقت خواستید دستی هم اشاره گر فایل رو تغییر بدین با fseek میتونید کار کنید که نیازمند دقت زیاد هست.
در مورد مزیت فایل باینری به متنی هم باید توجه کنید که مثلا اگه زمانی خواستید اطلاعات یه عکس (یا هر فایل غیر متنی دیگه) رو بخونید یا بنویسید دیگه فایل متنی جواب گو نیست.
کتاب C جعفرنژاد بحث کاملی در زمینه فایلها داره

موفق باشید.

amir-yeketaz
شنبه 19 دی 1388, 11:26 صبح
ببینید مشکل من تو پروژم برایه استفاده از فایل اینجاست که من یه ساختار دارم به این صورت

struct address{char state[30],city[30],sector[30],alley[30];};
struct client{
int stdclient;
char fname[30];
char lname[30];
char phone[15];
address a;
}; بعد اگه قرار باشه تو یه تابع اطلاعاته مشتری (client) رو وارد کنم با استفاده از فایل باینری
به این صورت


client enterclient(void){
client c;
FILE *fp;
fp=fopen("readclient.bin","r+b");
fread(&c,sizeof(c),1,fp);
return ????????;
} حالا اشکال اینجاست که من احتیاج دارم به یه بخش از ساختار مشتری مثلا stdclient یا همون شماره مشتری ،
اولا من میخوام تو این تابع کل اطلاعاته ساختار و برگردونم و بعدش هر جا خواستم از یه جایه خاص اون اطلاعات استفاده کنم. مشکل من همینه
میبینید که من نوع برگشتی رو از جنس ساختار گذاشتم که نمیدونم درسته یا نه چون نمیدونم چی رو باید برگردونم

gh-reza
شنبه 19 دی 1388, 16:17 عصر
همون c رو برگردون (return c) . توی تابع فراخواننده هم به صورت زیر استفاده کن.


client x = enterclient();
AnyFunction(x.stdclient);


که منظور از AnyFunction هر تابع یا عملی هست که میخاید انجام بدید

amir-yeketaz
شنبه 19 دی 1388, 18:54 عصر
من این کاری که گفتینو انجام میدم
حالا میشه یه مثال کامل(سورس کد) از این نوع استفاده از فایل باینری رو که من میخوامو بذارید
البته اگه دارین
واقعا ممنون میشم

gh-reza
شنبه 19 دی 1388, 21:12 عصر
این کد، مثال 8 از فصل 8 (فصل فایلها) کتاب جعفرنژادقمی هست.