PDA

View Full Version : چند سوال در مورد فایل ها



hercules_3d
یک شنبه 17 اردیبهشت 1385, 21:24 عصر
با عرض سلام وپوزش به دلیل سوال مجدد (با توجه به مشکلی که در سایت به وجود اومد نتونستم جواب سوالم رو ببینم و مجبور شدم دوباره سوال کنم)
یه چند تا سوال در مورد کد زیر داشتم :
1.
ifstream fp1("test.dat");
2. fp1.get(ch);
3. while(!fp1.eof()) {
4. cout.put(ch);
5. fp1.get(ch);
6. }
7. fp1.close();
8. cout << "\nOutput completed";
اول اینکه چرا اگه خط آخر نباشه چیزی رو که قراره توسط cout.put رو صفحه مونیتور چاپ بشه رو نمی بینم؟ (با فرض اینکه این جمله c is a language $ باشه)
دوم اینکه فرض کنیم خط 2 نباشه و جای خط 4 و 5 رو با هم عوض کنیم در این حالت خروجی برنامه در ظاهر مثل قبله ولی میخواهم بدونم واقعا این طوره ؟! در این صورت چطور بدون اینکه کاراکتری رو خونده باشه وارد حلقه میشه؟ :متعجب: تازه فرض کنیم که یه جورایی وارد حلقه شد
در این صورت یه کاراکتر میخونه یه کاراکتر چاپ میکنه و با این حساب باید کاراکتر EOF رو چاپ کنه!

hercules_3d
سه شنبه 19 اردیبهشت 1385, 05:52 صبح
با سلام و تشکر از پاسخ شما دوست عزیز
با توجه به شرایطی که گفتم یه جورایی وارد حلقه شدن فرض نیست بلکه واقعیته!! چون وقتی محتوای فایل من این جمله است دقیقا همین جمله رو چاپ میکنه c is a language $ و زمانی هم که فیل من خالیه یه خط خالی چاپ میکنه . حالا من سوالم اینجاست که چه جوری بدون خوندن کاراکتر وارد حلقه میشه؟

Mahdi_Delphi
سه شنبه 19 اردیبهشت 1385, 09:53 صبح
سلام
قبلا به این سوال یه جواب داده بودم که انگار به دلیل مشکلات فنی سایت پاک شده.
در مورد اینکه چرا تا خط 8 برنامه نباشه چیزی در خروجی نمایش داده نمیشه،باید بگم که این مشکل شما ناشی از بافرینگ هست.(شما چقدر با این بافرها برخورد دارید !!!).
وقتی از()cout.put استفاده میکنید کاراکترها در بافر خروجی میرن ولی تا وقتی که بافر پر نشه خروجی چاپ نمیشه.
برای خالی کردن بافر هم میتونید از cout<<flush یا cout<<endl استفاده کنید.
راحت تر خواهید بود اگه () cout.put رو با cout<<p تعویض کنید.

hercules_3d
سه شنبه 19 اردیبهشت 1385, 12:04 عصر
این بافر کی پر میشه که بتونه خودش خودش رو تخلیه کنه ؟

Mahdi_Delphi
سه شنبه 19 اردیبهشت 1385, 18:10 عصر
این بافر کی پر میشه که بتونه خودش خودش رو تخلیه کنه ؟

وقتی 512 تا کاراکتر بریزی توش.
اونوقت محتویات بافر نمایش داده میشه و بافر خالی میشه.بعد دوباره باید پر بشه تا محتویاتش روی مانیتور نمایش داده بشه.
همونطور که گفتم اگه از cout<< c استفاده کنید مشکلتون حل میشه.
موفق باشید
مهدی

hercules_3d
چهارشنبه 20 اردیبهشت 1385, 04:50 صبح
خیلی ممنون

Mahdi_Delphi
چهارشنبه 20 اردیبهشت 1385, 07:58 صبح
خواهش میکنم،قابلی نداشت.
در مورد فایل و وارد شدن به حلقه به این مثال توجه کنید:

(فایل test.txt رو در همون پوشه حاوی برنامه بسازید.یکبار فایل رو خالی بزارید و برنامه رو اجرا کنید. بار دیگه داخل اون کاراکترهایی رو بنویسید و بعد برنامه رو تست کنید. )


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

int main()
{
char ch;
clrscr();
ifstream fp1("test.txt");
while(! fp1.eof())
{
fp1.get(ch);
if(fp1.eof())
{
cout<<"<End Of File>";
break;
}
cout<<ch;
}
fp1.close();
getch();
return 0;
}

hercules_3d
چهارشنبه 20 اردیبهشت 1385, 09:59 صبح
حالا اگه تو همین کدی که شما نوشتین شرطی رو که داخل حلقه گذاشتین (اگه کارکتری رو که خونده کاراکتر انتهای فایل باشه از حلقه خارج شه ) رو برداریم و فایل هم خالی باشه اون موقع وقتی که وارد حلقه شد و کاراکتر انتهای فایل رو خوند چی رو چاپ میکنه؟ یه بار تست کردم هیچی چاپ نکرد ولی بعد اون هر بار که تست کردم یه space چاپ کرد میخواهم بدونم بابت همین space هستش که اون شرط رو داخل حلقه گذاشتین تا در صورت خالی بودن فایل این space چاپ نشه

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

int main()
{
char ch;
clrscr();
ifstream fp1("test.txt");
while(! fp1.eof())
{
fp1.get(ch);
/* if(fp1.eof())
}
cout<<"<End Of File>";
break;
}*/
cout<<ch;
}
fp1.close();
getch();
return 0;
}[/QUOTE]

Mahdi_Delphi
چهارشنبه 20 اردیبهشت 1385, 11:14 صبح
حالا اگه تو همین کدی که شما نوشتین شرطی رو که داخل حلقه گذاشتین (اگه کارکتری رو که خونده کاراکتر انتهای فایل باشه از حلقه خارج شه ) رو برداریم و فایل هم خالی باشه اون موقع وقتی که وارد حلقه شد و کاراکتر انتهای فایل رو خوند چی رو چاپ میکنه؟ یه بار تست کردم هیچی چاپ نکرد ولی بعد اون هر بار که تست کردم یه space چاپ کرد میخواهم بدونم بابت همین space هستش که اون شرط رو داخل حلقه گذاشتین تا در صورت خالی بودن فایل این space چاپ نشه

بله برای جلوگیری از نمایش همون فضای خالی بود.ولی این یک فضای خالی معمولی(Space) با کد 32 نیست بلکه دارای کد اسکی 1- هست.
1- هم در سیستم &#171;مکمل 2&#187; برابر 255 هست.

hercules_3d
چهارشنبه 20 اردیبهشت 1385, 19:15 عصر
اون موقع سیستم مکمل 2 چیه؟

Mahdi_Delphi
پنج شنبه 21 اردیبهشت 1385, 10:27 صبح
اون موقع سیستم مکمل 2 چیه؟

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