C語言中關於feof的使用問題

2021-09-26 07:49:51 字數 1502 閱讀 5603

當你想讀取文字檔案的全部內容時,卻發現容易出現奇怪的現象或者最後一行重複讀取?細心看完這篇你就知道為什麼了。

#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 值得注意的是,針對字串換行,需要注意換...