關於eof的煩惱

2021-07-15 06:20:49 字數 1118 閱讀 3153

int main()

f2.close();

char ch;

ifstream f1("c:\\read.txt");

while(!f1.eof())

{ f1>>ch;

cout<

當test.txt為空時,列印出乙個x字元;存在一字串「abcd」且沒有換行時,程式列印出「abcdd」;當存在以上字串並且有一新的空行時,程式列印出「abcd」加上一空行。

這種現象可能讓很多人很迷惑,程式執行的結果似乎很不穩定,時對時錯。使用binary模式讀時結果一樣。在這裡,大家可能有乙個誤區,認為eof()返回true時是讀到檔案的最後乙個字元,其實不然,

c++ eof()函式返回true時是讀到檔案結束符0xff,而檔案結束符是最後乙個字元的下乙個字元。

按常理邏輯來說,如果到了檔案末尾的話,eof()應該返回真,但是,c++輸入輸出流如何知道是否到末尾了呢?

原來根據的是:如果fin>>不能再讀入資料了,才發現到了檔案結尾,這時才給流設定檔案結尾的標誌,此後呼叫eof()時,才返回真。

假設find>>x; //此時檔案剛好讀完最後乙個資料(將其儲存在x中)但是,這時fin.eof()仍為假,因為 fin流的標誌eofbit是false,fin流此時認為檔案還沒有到末尾,只有當流再次讀寫時 fin>>x ,發現已無可讀寫資料,此時流才知道到達了結尾,這時才將標誌eofbit修改為true,此時流才知道檔案到了末尾。也就是說,eof在讀取完最後乙個資料後,仍是false,當再次試圖讀乙個資料時,由於發現沒資料可讀了,才知道到末尾了,此時才修改標誌,eof變為true。

因此,當讀到最後乙個字元時,程式會多讀一次(編譯器會讓指標停留在最後乙個字元那裡,然後重複讀取一次,這也就是就上面最後乙個字元會輸出兩次的原因。至於是不是所有的編譯器都這樣處理我就不太清楚了,我使用的vc6,vc8似乎都是這樣的)

綜上對c++ eof()函式的描述,我們可以得到以下結論:

1. 判斷檔案是否為空時使用peek函式,若peek返回eof則檔案為空;f.peek() == eof 或 f.get(ch)

2. 讀取檔案過程中,讀取非char型時,使用peek判斷檔案尾將不再適用,迴圈判斷條件應改用》操作符進行讀取,若讀入char型緩衝區,peek函式會表現得很好。f>>str

關於C語言的EOF

eof,它是end of file的縮寫,表示 文字流 stream 的結尾。這裡的 文字流 可以是檔案 file 也可以是標準輸入 stdin 比如,下面這段 就表示,如果不是檔案結尾,就把檔案的內容複製到螢幕上。int c while c fgetc fp eof eof不是特殊字元,而是乙個定...

關於EOF的幾個問題

1 如何輸入eof ctrl z in win or ctrl d in linux 2 阻塞式以及非阻塞式 輸入緩衝是行緩衝。當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車鍵後,cin.get 就會檢測輸入緩衝區中是否有了可讀的資料。cin.get 還會對鍵盤...

關於EOF的個人理解(小白向)

上上週社團的課講到了乙個叫eof的東西,但是我沒去聽,所以只能自己來理解了,具體 如下 while scanf d d a,b eof 去查了很多資料,發現都講的太深入了 涉及很多概念 可能不太好理解,我這裡不講深入的,直接用通俗易懂的語言來講講這行 到底發生了什麼吧!首先來說說eof eof是en...