檔案結束符 End Of File

2021-06-20 17:28:44 字數 1189 閱讀 5686

先看下面的程式

#include#includeusing namespace std;

int main()

{ ofstream outfile("test.txt");

outfile<<"abcdefg";

outfile.close();

char c;

ifstream infile("test.txt");

while(!infile.eof())

{ infile>>c;

cout<

其輸出是" abcdefgg ",可以發現輸出了兩個「 g 」,這是什麼原因呢?

1、檔案指標

當開啟乙個檔案時,對檔案輸入流來說,指標指向的是當前讀取字串的下一位,每讀一位,指標就往下移一位。

2、關於eof

大家通常誤認為檔案結束符eof是從檔案讀取的乙個字元,其實不然,eof被定義為int型的乙個負數(比如-1)。eof也不是檔案中實際存在的內容,而是檔案流的狀態標誌。在c++中,當讀取檔案失敗才產生eof,所以當輸出第一「 g 」時,產生eof,輸出第二個「 g 」時,讀取到eof,迴圈結束。

3、解決方案

將判斷迴圈結束的方式改為「 infile.peek() != eof 」。

infile.peek() 其返回值是乙個char型的字元

,其返回值是指標

指向的當前字元,但它只是觀測,指標仍停留在當前位置,並不後移。

修改程式如下:其輸出結果是」abcdefg「

#include#includeusing namespace std;

int main()

{ ofstream outfile("test.txt");

outfile<<"abcdefg";

outfile.close();

char c;

ifstream infile("test.txt");

while(infile.peek() != eof)

{ infile>>c;

cout<

注:程式修改之後,若輸入字串最後有乙個空格符或換行符,則輸出結果是"abcdefgg",因為輸出"g"時,檔案還沒有結束(還有乙個空格符或換行符),而peek()函式不會刪除之前快取區里的字元"g",所以迴圈繼續,輸出的還是"g"。

C 如何輸入檔案結束符(end of file)

當我們使用乙個istream物件作為條件時,其效果是檢測流的狀態。如果流是有效的,即流未遇到錯誤,那麼檢測成功。當我們遇到檔案結束符 end of file 或遇到乙個無效輸入時 例如,讀入的值不是乙個整數時 istream物件的狀態會變為無效。處於無效狀態的istream物件會使條件變為假。inc...

檔案結束符

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

C 檔案結束符

問題描述 windows下 int main string str while cin str cout n end 控制台輸入多個字串後,輸入檔案結束符crtl z,並未使while迴圈結束,該如何跳出while迴圈?解決方法 方法1 回車 ctrl z 回車方法2 改 設定自己的檔案結束符 st...