C語言中的EOF是什麼?

2021-06-21 22:59:31 字數 1763 閱讀 9501

日期: 2023年11月12日

我學習c語言的時候,遇到的乙個問題就是eof。

它是end of file的縮寫,表示"文字流"(stream)的結尾。這裡的"文字流",可以是檔案(file),也可以是標準輸入(stdin)。

比如,下面這段**就表示,如果不是檔案結尾,就把檔案的內容複製到螢幕上。

int c;

while ((c = fgetc(fp)) != eof)

很自然地,我就以為,每個檔案的結尾處,有乙個叫做eof的特殊字元,讀取到這個字元,作業系統就認為檔案結束了。

但是,後來我發現,eof不是特殊字元,而是乙個定義在標頭檔案stdio.h的常量,一般等於-1。

#define eof (-1)

於是,我就困惑了。

如果eof是乙個特殊字元,那麼假定每個文字檔案的結尾都有乙個eof(也就是-1),還是可以做到的,因為文字對應的ascii碼都是正值,不可能有負值。但是,二進位制檔案怎麼辦呢?怎麼處理檔案內部包含的-1呢?

這個問題讓我想了很久,後來查了資料才知道,在linux系統之中,eof根本不是乙個字元,而是當系統讀取到檔案結尾,所返回的乙個訊號值(也就是-1)。至於系統怎麼知道檔案的結尾,資料上說是通過比較檔案的長度。

所以,處理檔案可以寫成下面這樣:

int c;

while ((c = fgetc(fp)) != eof)

這樣寫有乙個問題。fgetc()不僅是遇到檔案結尾時返回eof,而且當發生錯誤時,也會返回eof。因此,c語言又提供了feof()函式,用來保證確實是到了檔案結尾。上面的**feof()版本的寫法就是:

int c;

while (!feof(fp))

但是,這樣寫也有問題。fgetc()讀取檔案的最後乙個字元以後,c語言的feof()函式依然返回0,表明沒有到達檔案結尾;只有當fgetc()向後再讀取乙個字元(即越過最後乙個字元),feof()才會返回乙個非零值,表示到達檔案結尾。

所以,按照上面這樣寫法,如果乙個檔案含有n個字元,那麼while迴圈的內部操作會執行n+1次。所以,最保險的寫法是像下面這樣:

int c = fgetc(fp);

while (c != eof)

if (feof(fp)) else

除了表示檔案結尾,eof還可以表示標準輸入的結尾。

int c;

while ((c = getchar()) != eof)

但是,標準輸入與檔案不一樣,無法事先知道輸入的長度,必須手動輸入乙個字元,表示到達eof。

linux中,在新的一行的開頭,按下ctrl-d,就代表eof(如果在一行的中間按下ctrl-d,則表示輸出"標準輸入"的快取區,所以這時必須按兩次ctrl-d);windows中,ctrl-z表示eof。(順便提一句,linux中按下ctrl-z,表示將該程序中斷,在後台掛起,用fg命令可以重新切回到前台;按下ctrl-c表示終止該程序。)

那麼,如果真的想輸入ctrl-d怎麼辦?這時必須先按下ctrl-v,然後就可以輸入ctrl-d,系統就不會認為這是eof訊號。ctrl-v表示按"字面含義"解讀下乙個輸入,要是想按"字面含義"輸入ctrl-v,連續輸入兩次就行了。

(完)

C語言中的EOF是什麼?

在c語言中,用getchar 讀取檔案檢測到檔案結尾時將返回乙個特殊的值,即eof end of file scanf 函式檢測到檔案結尾時也返回eof eof定義在stdio.件 includeint main void 不用定義eof,因為stdio.h中已經定義過了。不用擔心eof的實際值,因...

C語言中EOF什麼意思

首先看一下eof的官方解釋 計算機術語,縮寫通常為eof end of file 在作業系統中表示資料來源無更多的資料可讀取。資料來源通常稱為檔案或串流。在c語言中,或更精確地說成c標準函式庫中表示檔案結束符 end of file 在while迴圈中以eof作為檔案結束標誌,這種以eof作為檔案結...

C語言中的EOF

在c語言中,或更精確地說成c標準函式庫中表示檔案結束符 end of file 在while迴圈中以eof作為檔案結束標誌,這種以eof作為檔案結束標誌的檔案,必須是文字檔案。在文字檔案中,資料都是以字元的ascii 值的形式存放。我們知道,ascii 值的範圍是0 127,不可能出現 1,因此可以...