PDA

View Full Version : مشکل در استفاده از دستور filename.write(...)؟



BeginnerProgrammer
چهارشنبه 18 خرداد 1390, 15:17 عصر
سلام دوستان
من یه برنامه با سی++ نوشتم میخوام 1000تا رکورد از نوع کلاسم داخل یه فایلی txt ذخیره کنم خیلی تو اینترنت گشتم همه دستوراتو امتحان کردم ولی بازم کاراکترای بی معنی تو فایلم مینویسه :ناراحت:
این فایل ذخیره شده س :ناراحت::ناراحت::ناراحت::نار حت:


ججججججججججججT ] ZQGMBQZQSجججح(  2 ججججججججج ى 
1 ه؟[ ه؟[ ّن؟[ّن؟[ üن؟[üن؟[xwp جججججججج ج جج جججّن؟[ججججى
جججج   Hwp ججججکü/ جججججججججججججججX جججججججج@‏/ ججججBï_±´‏/ $ہ  t‏/ ( P‎جججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج ججججججججججججججججججججججج° 1 ججججججججججججججججججججججججج ججججججججججججججججججج^ى_±ؤ‏/ ¯–  p p îى_± P‎û7 0 ˆ‏/  ے/ گ ’=|± ج‏/ ك” ط‏/ ”ٌv P‎ے/ )´+w P‎›َ u P‎ ن‏/ ےےےےUص'w3 $ 0ے/ ü³+wè P‎ è P‎ ü=L×>îےîے ¨ p  p p 0  @ 0 @ î  ً1 ً1 مـ5‍ك>¨xH ےےےے ط1 ط1 p                         



                                   ! # ! % " ' # ) $ + % - & / ' 1 ( 3 ) 5 * 7 + 9 , ; - = . ? / A 0 E 1 I 2 M 3 Q 4 U 5 Y 6 ] 7 a 8 e 9 i : m ; q < u = y > } ? پ @ ‰ A ‘ B ™ C ، D © E ± F ¹ G ء H ة I ر J ظ K ل L é M ٌ N ù O P Q !R 1S AT QU aV qW پX ‘Y ،Z ±[ ء\ ر] ل^ ٌ_ ` !a Ab ac پd ،e ءf لg h !i Aj ak پl ،m ءn لo p Aq پr ءs t Au پv ءw x Ay پz ء{ | A} پ~ ء  ط1 H 0  1 1  *  X0   è1  8  X0   ججججججججججججU Z DEKQEPMBRجججم( 
ججججججججج ى 
1 ه؟[ ه؟[ ّن؟[ّن؟[ üن؟[üن؟[xwp جججججججج ج جج جججّن؟[ججججى
جججج   Hwp ججججکü/ جججججججججججججججX جججججججج@‏/ ججججBï_±´‏/ $ہ  t‏/ ( P‎جججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججhp °1 ججججججججججججججججججججججججج ججججججججججججججج^ى_±ؤ‏/ ¯–  p p îى_± P‎û7 0 ˆ‏/  ے/ گ ’=|± ج‏/ ك” ط‏/ ”ٌv P‎ے/ )´+w P‎›َ u P‎ ن‏/ ےےےےUص'w3 $ 0ے/ ü³+wè P‎ è P‎ ü=L×>îےîے ¨ p  p p 0  @ 0 @ î  ً1 ً1 مـ5‍ك>¨xH ےےےے ط1 ط1 p                         



                                   ! # ! % " ' # ) $ + % - & / ' 1 ( 3 ) 5 * 7 + 9 , ; - = . ? / A 0 E 1 I 2 M 3 Q 4 U 5 Y 6 ] 7 a 8 e 9 i : m ; q < u = y > } ? پ @ ‰ A ‘ B ™ C ، D © E ± F ¹ G ء H ة I ر J ظ K ل L é M ٌ N ù O P Q !R 1S AT QU aV qW پX ‘Y ،Z ±[ ء\ ر] ل^ ٌ_ ` !a Ab ac پd ،e ءf لg h !i Aj ak پl ،m ءn لo p Aq پr ءs t Au پv ءw x Ay پz ء{ | A} پ~ ء  ط1 H 0  1 1  *  X0   è1  8  X0   ججججججججججججU e YMTKTKTDUجججI(  : ججججججججج ى 
1 ه؟[ ه؟[ ّن؟[ّن؟[ üن؟[üن؟[xwp جججججججج ج جج جججّن؟[ججججى
جججج   Hwp ججججکü/ جججججججججججججججX جججججججج@‏/ ججججBï_±´‏/ $ہ  t‏/ ( P‎جججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججج جججججججججججججججججججججججہ p °1 ججججججججججججججججججججججججج ججججججججججججججج^ى_±ؤ‏/ ¯–  p p îى_± P‎û7 0 ˆ‏/  ے/ گ ’=|± ج‏/ ك” ط‏/ ”ٌv P‎ے/ )´+w P‎›َ u P‎ ن‏/ ےےےےUص'w3 $ 0ے/ ü³+wè P‎ è P‎ ü=L×>îےîے ¨ p  p p 0  @ 0 @ î  ً1 ً1 مـ5‍ك>¨xH ےےےے ط1 ط1 p                         



                                   ! # ! % " ' # ) $ + % - & / ' 1 ( 3 ) 5 * 7 + 9 , ; - = . ? / A 0 E 1 I 2 M 3 Q 4 U 5 Y 6 ] 7 a 8 e 9 i : m ; q < u = y > } ? پ @ ‰ A ‘ B ™ C ، D © E ± F ¹ G ء H ة I ر J ظ K ل L é M ٌ N ù O P Q !R 1S AT QU aV qW پX ‘Y ،Z ±[ ء\ ر] ل^ ٌ_ ` !a Ab ac پd ،e ءf لg h !i Aj ak پl ،m ءn لo p Aq پr ءs t Au پv ءw x Ay پz ء{ | A} پ~ ء  ط1 H 0  1 1  *  X0   è1  8  X0  

کسی نمیدونه مشکل چیه؟
اینم شبه کدیه که نوشتم:


ofstream saveF("c:/mf/SAVE.txt",ios::binary);
.
.
.
saveF.write((char *)&myRecord,address *( sizeof(myRecord)));

myRecord متغیری از نوع کلاسیه که تعریف کردم.

یوسف زالی
چهارشنبه 18 خرداد 1390, 15:43 عصر
سلام. اون کاراکتر ها بی معنی نیستند.
در اصل ساختار رکورد هم جزء داده محسوب میشه.
شما اگر می خواهی اونها رو نبینی باید تک تک مقادیر رو جدا جدا ذخیره کنی نه اینکه یه رکورد رو یهو ذخیره کنی.
برنامه باید از یه جایی بفهمه که اگر قراره از فایل بخونه از کجا تا کجاش مثلا برای فیلد اول رکورد هست دیگه.
برای همین هم کاراکتر هایی رو از جنس کاراکترهای کنترلی که در تایپ کاربردی ندارند بین اونا میگذاره.

یوسف زالی
چهارشنبه 18 خرداد 1390, 15:45 عصر
یه احتمال دیگه این هست که متغیر شما مقدار اولیه نداره و برنامه توش آشغال پر کرده.
تست کنید ببینید دقیقا قبل از نوشتن توش چی هست

BeginnerProgrammer
چهارشنبه 18 خرداد 1390, 17:47 عصر
ممنون از پاسختون.
نمیشه فیلدهای رکوردمو جدا ذخیره کنم چون مکان ذخیره رکوردها توسط برنامه تعیین میشه یعنی رکوردها به ترتیب ایجاد ذخیره نمیشن بلکه آدرس ذخیره شون به طور تصادفی تعیین میشه .
10000 تا رکورد هم دقیقا تولید میشه و کل فیلداشونم مقدار داره هر رکوردم قبل ذخیره شدن مقدار میگیره .

یوسف زالی
چهارشنبه 18 خرداد 1390, 21:30 عصر
اگر از همون فایل که ساختی بخونی چی میده؟
البته با نوع همون که باهاش نوشتی بخونی.
ممکنه اطلاعات باینری وقتی دخیره میشن اونجوری شن که اگه این طوره مهم نیست.

BeginnerProgrammer
پنج شنبه 19 خرداد 1390, 10:02 صبح
این برنامه رو برای درس ذخیره میخوام. کدش زیاد برای استادمون مهم نیست . مهم فایلیه که ذخیره میکنه یعنی اطلاعات فایل حتما قابل خوندن باشه.

quiet_programmer
پنج شنبه 19 خرداد 1390, 11:32 صبح
با سلام.

من هرچی فکر کردم متوجه نشدم که شما چرا address رو در sizeof ضرب میکنی؟ اصلا address چیه؟

در هر حال ببین وقتی شما یک فایل رو بصورت باینری باز میکنی اگه حتی یه متغییر از نوع int رو هم ذخیره کنی امکان داره به یه شکل دیگه ذخیره بشه. ببین فقط شکل نمایش فرق کرده ولی با ساختار نوع داده ذخیره شده همخوانی داره.

محتویات فایل بالا هم قابل خوندنه. فقط توسط همون برنامه. و این کاراکترهایی که تو فایل نوشته شدند بی معنی نیستند. برای تست میتونی فایل رو بصورت iso::in باز کنی و توسط دستور زیر یکی از اونها رو بخونی و در خروجی نمایش بدی.

saveF.seekg(0,iso::beg);
saveF.read((char *)&myRecord,address *( sizeof(myRecord)));

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

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

BeginnerProgrammer
پنج شنبه 19 خرداد 1390, 22:11 عصر
آدرس یه متغیر که از طریق انجام عملیات روی یکی از فیلدهای فایل درست میشه و مکان ذخیره کردن رکورد مورد نظرو تو فایل مشخص میکنه تا از طریق فیلدی که درست شده به سادگی بتونی به رکورد دسترسی پیدا کنی اگه بخوام فیلدها رو جداگونه ذخیره کنم فضایی که برای ذخیره یک رکورد توسط دستور .write گرفته میشه با این فضا یکیه؟ چون اینجور که شما نوشتین برای اینکه فایلم قابل خوندن باشه حتما باید متنی باشه ( درسته؟)

یوسف زالی
جمعه 20 خرداد 1390, 03:40 صبح
همان طور که جناب quiet گفتند برای اینکه بخواهید فایل در ویندوز قابل مشاهده باشد باید خودتون ساختار رو ذخیره کنید اما برای نمایش رکورد خاص اگر طولهای یکسانی انتخاب کرده باشید نیازی به خواندن همه رکوردهای قبل ندارید.کافیه که دوباره به صورت باینری بازش کنید.
یه پیشنهاد دارم: یه تابع بنویسید که یه رکورد بگیره و به صورت متن مثلا فیلد هارو با enter جدا کنه و ذخیره کنه.
مثلا هر پنج خط هم بشه یه رکورد. حالا این تابع رو 10000 بار call کنید جای write.
فرمت فایل رو هم txt باز کنید.