最近寫了些**,在對檔案的操作中發現了很經典的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物件作為條件,結果是測試流的狀態。如果流是有效的,也就是說,如果讀入下乙個輸入是可能的,那麼測試成功。遇到檔案結束符或遇到無效...