當你想讀取文字檔案的全部內容時,卻發現容易出現奇怪的現象或者最後一行重複讀取?細心看完這篇你就知道為什麼了。
#include
#define test_file "test.txt"
intmain()
fclose
(fp)
;return0;
}
輸出結果為
可以看到明明只有三個字元的檔案卻輸出了四行!第四行ascii碼為-1的輸出是什麼呢?
而把ch=fgetc(fp)
改為fscanf(fp,"%c",&ch)
或fread(&ch,1,1,fp)
,此時第四次迴圈遇到eof時不能讀入有效字元,就會重複輸出最後乙個字元。(注意,fscanf和fread返回值為int型別,讀不到有效字元並不會改變ch,所以和上述fgetc不同,ch不會發生變化)
函式feof可以測出檔案位置標記是否已經指到檔案末尾。檔案結束:返回非0值,檔案未結束,返回0值。
eof又是什麼呢
eof是文字檔案結束的標誌。eof 不是乙個字元,也不是檔案中實際存在的內容。當讀取檔案到位元組為eof時,讀取檔案才結束。
eof16進製為0xff(十進位制為-1),即上文所問的-1輸出就是eof,文字檔案中(即ascii碼檔案)字元的ascii碼範圍為32~127,與eof不衝突;但是在二進位制檔案中,資料有可能出現0xff(-1),因此不能用eof作為二進位制檔案的結束標誌,需通過feof來判斷。
說eof只能用於文字檔案,其實不然,這點不是特別的準確,還要看定義的變數的型別。詳細請見
feof()和eof的用法—— c中檔案結尾的判斷在c語言中,feof()函式的使用是根據指標內容判斷的,而非指標位置,無論指標是否到頭,甚至超出了,它都需要先讀取指標的內容,看一看內容是否是eof,然後才知道檔案到頭了。看到這裡你應該能夠知道上文例子中為什麼會出現這個問題了,因為feof需要在第四次迴圈讀出eof之後,才知道檔案結束了。
乙個原則:先讀再判斷是否檔案結束,即
ch=
fgetc
(fp)
;while(!
feof
(fp)
)
先讀入,然後判斷此時的指標位置是否合法,在合法的情況下輸出上一次讀入的值,然後在讀取下乙個。此次輸出結果正常。
C語言中的EOF和feof
原文 在c語言中經常用eof和feof 來判斷檔案的結束,現將有關用法總結如下 定義eof是end of file 的縮寫,是c語言中標準庫中定義的巨集,定義為 define eof 1 feof 用於測試流檔案的結束,有巨集和函式兩種定義 巨集定義 define feof stream strea...
關於c語言中的return問題
最近看32的 比較多,發現乙個小小的細節有點疑問。原來我們學習c語言時對於返回值,如果要返回0,那麼語句就是return 0 如果返回1,那麼語句就為return 1 但是在32 裡面我看見了return 0 還有return 1 他們有差別麼?今天在資料結構中也看見了類似的問題,決定來驗證一下 測...
關於C語言中的換行問題
1 換行,使用換行符 n 例如 printf hello n 2 回車換行,使用回車換行符 r n 例如 printf hello r n 3 對於表示式較長,想分行寫的問題,可採用兩種方式 方法一 使用 結尾作為換行標記。printf hello world 值得注意的是,針對字串換行,需要注意換...