PDA

View Full Version : سوال: خواندن با استفاده از دستور filename.read(...)



BeginnerProgrammer
سه شنبه 07 تیر 1390, 23:06 عصر
با سلام
من میخوام یه رکورد رو از فایل بخونم ولی نمیدونم چرا نمیشه:عصبانی++:
این کدشه(البته بخشی از کد):


myclass myclass::search(int key)
{
saveFR.open("SAVE.txt",ios::binary);
int m,j=1;
m=ChooseDigit(key);
daroo temp;
saveFR.read((char *)&temp,m*sizeof(temp));
if(key==temp.code)
return temp;
else{
while((temp.code>0)||((temp.code)<1000000)||(j<7000)){
++j;
if(temp.code==key)
return temp;
else
temp=*(temp.link);
}

}
myclass d;
return d;
}

تابع generateAddress بصورت تصادفی آدرس مربوط به کلید رو تولید میکنه
لطفا کمک کنید :(

Omid707
چهارشنبه 08 تیر 1390, 01:35 صبح
با سلام
من میخوام یه رکورد رو از فایل بخونم ولی نمیدونم چرا نمیشه:عصبانی++:
این کدشه(البته بخشی از کد):

تابع generateAddress بصورت تصادفی آدرس مربوط به کلید رو تولید میکنه
لطفا کمک کنید :(




سلام

اینطور که من فهمیدم از محتوا و عنوان تاپیک ، شما فقط در خواندن دیتا از فایل مشکل دارید یه جایی خوندم که توابع read و write به اشاره گر هایی از نوع char * و const char * نیاز دارند و زمانی که آرگومان شما از نوع دیگری باشه بهتره که از عملگر تبدیل موقت نوع استفاده کنید و الا برنامه تون بدرستی اجرا نمیشه

راستش برنامه های من بدون این عملگر هم اجرا می شدند واین ممکنه بخاطر نوع کامپایلر من باشه یعنی توصیه اون کتاب برای کامپایلر های خاصی بوده باشد

بعنوان یک احتمال خیلی ضعیف عرض میکنم شاید کد شما جز همون موارد باشه
عملگر تبدیل موقت نوع:


saveFR.read( reinterpret_cast< char * >&temp, m*sizeof(temp) );

BeginnerProgrammer
چهارشنبه 08 تیر 1390, 22:40 عصر
اینجوریم باز جواب نمیده ! ;(
من یه سوال دیگه داشتم تویه یه تاپیک دیگه پرسیدم ولی جواب نگرفتم دوباره میپرسم: فضایی که یک رکورد میگیره وقتی فیلدهاشو جداگونه تو فایل ذخیره کنی با وقتی که رکوردو یکجا ذخیره کنی برابره؟

Omid707
پنج شنبه 09 تیر 1390, 08:14 صبح
اینجوریم باز جواب نمیده ! ;(
من یه سوال دیگه داشتم تویه یه تاپیک دیگه پرسیدم ولی جواب نگرفتم دوباره میپرسم: فضایی که یک رکورد میگیره وقتی فیلدهاشو جداگونه تو فایل ذخیره کنی با وقتی که رکوردو یکجا ذخیره کنی برابره؟

سلام
من یکی از برنامه های قبلی خودم را مثل برنامه شما تغییر دادم واجرا نشد متوجه شدم اشکال کار از کجاست. شما نمیتوانید با read مستقیما سراغ رکورد مورد نظر خود بروید بلکه باید از تابع موقعیت دهنده یا اشاره گر موقعیت فایل استفاده کنید به اینصورت

saveFR.seekg( (m-1) * sizeof( temp ) );
saveFR.read( reinterpret_cast< char * >( &temp ),
sizeof( temp ) );
البته با توجه به کلاسی که تعریف کردین به نظرم باید اینطور باشه

saveFR.seekg( (m-1) * sizeof( daroo ) );
saveFR.read( reinterpret_cast< char * >( &temp ),
sizeof( daroo ) );

فراموش نشود بعد از استفاده از تابع، اشاره گر موقعیت فایل را به ابتدای فایل برگردانید با این دستورها

A.clear();//ریست کردن پایان فایل برای ورودی بعدی
A.seekg( 0 );//انتقال به ابتدای فایل
البته فقط زمانی که بخواهید برای بار دوم از همین دستور استفاده کنید.

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

A.seekg( n , ios::beg );
A.seekg( n , ios::end );
A.seekg( n , ios::cur );
اولی برای موقعیت یابی نسبی از ابتدای یک استریم(جریان ورودی از فایل)،دومی برای موقعیت یابی نسبی از انتهای استریم و آخری برای موقعیت یابی نسبی با موقعیت جاری در استریم.

و برای نوشتن

A.seekp( n , ios::beg );
A.seekp( n , ios::end );
A.seekp( n , ios::cur );
توضیح دستور ها مشابه قبلی.

واگر بخواهید بدانید که الان در کجای استریم هستید تا با توجه به موقعیت فعلی از توابع استفاده کنید با این کد موقعیت فعلیتان بدست می آید

long Location;//آدرس مکان در این متغیر ذخیره و در صورت لزوم بازیابی میشود
Location = A.tellg();//را برگشت میدهد get مکان جاری اشاره گر
Location = A.tellp();//را برگشت میدهد put مکان جاری اشاره گر


موفق باشید

BeginnerProgrammer
پنج شنبه 09 تیر 1390, 20:15 عصر
خیلی ممنون از پاسخ (خیلی) کاملتون
ولی : فضایی که یک رکورد میگیره وقتی فیلدهاشو جداگونه تو فایل ذخیره کنی با وقتی که رکوردو یکجا ذخیره کنی برابره؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Omid707
جمعه 10 تیر 1390, 00:49 صبح
خیلی ممنون از پاسخ (خیلی) کاملتون
ولی : فضایی که یک رکورد میگیره وقتی فیلدهاشو جداگونه تو فایل ذخیره کنی با وقتی که رکوردو یکجا ذخیره کنی برابره؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
سلام
از نظر تئوری : فکر نمی کنم فرقی داشته باشه،یک رکورد را به عنوان یک شی از کلاس در نظر بگیرید و فیلد ها اعضای داده ی این کلاس خواهند بود. برای هر نوع داده ای متناسب با معماری سخت افزار تعداد بایت خاصی اختصاص می یابد. حال فرقی نمیکند که شما این واحد های داده را جداگانه ذخیره کنید یا یکجا

از نظر تجربی : نمیدانم چون تا بحال نیازی به اینکار نداشتم و از نظر مهندسی نرم افزار هم کار جالبی نیست چون هزینه دست یابی به داده ها رو افزایش میده و احتمال ابهام در کد بیشتر میشه

***بالاخره برنامه تون اجرا شد یا نه؟ اگه هنوز کار نمیکنه اشکال در کلاس ها یی است که تعریف کردید.

BeginnerProgrammer
جمعه 10 تیر 1390, 01:12 صبح
بالاخره اجرا نشده واقعا موندم چیکارش کنم!

در هر حال خیلی ممنون از راهنماییتون .

Omid707
جمعه 10 تیر 1390, 09:00 صبح
بالاخره اجرا نشده واقعا موندم چیکارش کنم!

در هر حال خیلی ممنون از راهنماییتون .
سلام
چون شما نوشته بودید با ()filename.read مشکل دارید من هم از اول فقط به همین خط از کد شما نگاه کردم و الان میبینم که جریان فایل رو هم اشتباه تعریف کردین. برای خواندن و نوشتن از فایل باید in و out را بنویسید به اینصورت

saveFR.open( "SAVE.txt", ios::in | ios::out | ios::binary );
و اگر فقط قصد خواندن دارید ios::in ، واگر فقط قصد نوشتن دارید ios::out کفایت میکند
این تغییرات در کنار seekg و seekp الزامی است.

نکته 1:اگر فایل را برای خواندن باز میکنیدsaveFR باید شی از کلاس ifstream باشد

ifstream saveFR;
اگر فایل را برای نوشتن باز میکنید saveFR باید شی از کلاس ofstream باشد

ofstream saveFR;
اگر فایل را برای خواندن و نوشتن باز میکنید saveFR باید شی از کلاس fstream باشد

fstream saveFR;
البته شما برنامه نویس هستید و این موارد برایتان پیش پا افتاده به نظر میرسد ولی همیشه حتی حرفه ای ها در مواردی خطا میکنند مثل کاربرد = بجای == که به همین سادگی خروجی را خراب میکند.

نکته 2:این کدها برای باز کردن فایل دسترسی تصادفی Random-Access File است و اگر فایل را به روش ترتیبی Sequential ایجاد و نوشته اید با این کد ها نمی توانید آنرا بخوانید یا خروجی مغشوش خواهید داشت

نکته 3:اگر با وجود این اصلاحات برنامه اجرا نشد ، در مرحله نوشتن داده ها در فایل هم اشتباه کرده اید

نکته 4:اگر فایل رو با یه پسوند مثل DAT . یا هر پسوند غیر متنی ذخیره کنید بهتر است چون احتمال تغییر داده ها با باز کردن ساده فایل در یک ویرایشگر متن وجود ندارد

موفق باشید