關於EOF 檔案結束符 問題的體會

2021-04-12 21:42:01 字數 1310 閱讀 4391

最近寫了些**,在對檔案的操作中發現了很經典的eof問題,呵呵。

eof,即end of file,檔案結尾,作為檔案結束的標誌,在程式中常作為判斷的乙個標誌。但在我們平常的程式中卻常發生意想不到的結果。

下面這段程式,猜猜它輸出的是什麼?

char c;

ifstream fin("d://dat");//設d:/dat檔案已存在,內容為ab。

while(!fin.eof())

輸出結果是abb,沒想到嗎?你可能會問,再輸出第乙個b的時候,檔案指標已經指向了eof,為何不結束?

問題的關鍵是檔案eof機制是怎樣運作的。

我們來談三個問題:

1、檔案指標

當開啟乙個檔案時,檔案指標位置為0,並不是指向第乙個字元,即第乙個字元的位置為1。這一點我們可以通過peek()函式驗證。peek()返回的是當前檔案指標下乙個位置的字元。所以有:

ofstream fo("d://dat");

fo << 'h';

fo.close();

ifstream fi("d://dat");

char temp = fi.peek();

cout << temp;

會顯示h。

還有,用fo.seekp(0,ios::beg),得檔案指標為0;fo.seekp(0,ios::end),得檔案指標指向最後乙個字元。

2、關於eof

很多朋友認為檔案尾有eof,這是錯誤的。eof是流的狀態標誌。在 c++中,是在讀取檔案失敗時才產生eof。所以第乙個程式中,在輸出第乙個b時,產生了eof,再輸出第二個b時讀取到eof,迴圈結束。

3、解決eof困惑的辦法

我感覺在判斷檔案結束上,最好的方法就是判斷檔案指標相對於開頭的位置,是否等於檔案長度。即:

long filelen;

ifstream fin("d://dat");//設d:/dat檔案已存在,內容為ab。

fin.seekg(0,ios::end);

filelen = fin.tellg();//獲取檔案長度

fin.seekg(0,ios::beg);

while (1)

讀取資料...

}當然還有別的方法,就是用peek()的預讀性。

peek()返回當前檔案指標下乙個位置的字元,而指標位置不變。所以我們可以這樣:

while (fi.peel()!=eof)

當while迴圈體中,檔案指標指向最後乙個字元,若沒有fi.peel()!=eof,則需要再下乙個迴圈中才能觸發eof。而加了fi.peel()!=eof後,用預讀的方法檢測出了eof。呵呵,這個方法挺好的吧!

檔案結束符eof的正確使用

問題 來自 http topic.csdn.net u 20100103 00 99f1111e aebc 496d bcb2 889bbe82f091.html 如下 原因 剛好讀到檔案尾的時候,並不會設定檔案結束的標誌位,只有再讀取乙個位元組 由於到了檔案尾了,所以,讀取會失敗 時,才會設定檔案...

換行符 和 檔案結束符EOF

1 在dos平台下,該字元會被展開成 lf 兩個控制字元 相當於 r n 在ascii字符集下是 0dh,0ah 2 在unix平台下,僅僅是,不會展開。3 在二進位制方式下,不管是什麼平台,n 都是精確的。關於eof eof可以作為文字檔案的結束標誌,但不能作為二進位制檔案的結束符.feof函式既...

檔案結束符

初學c 一道例題 使用者輸入一組數,在輸出資訊中顯示共輸入多少個負數。include using namespace std int main cout 當使用istream物件作為條件,結果是測試流的狀態。如果流是有效的,也就是說,如果讀入下乙個輸入是可能的,那麼測試成功。遇到檔案結束符或遇到無效...