C語言中的EOF和feof

2021-06-23 02:10:19 字數 2543 閱讀 1204

原文

在c語言中經常用eof和feof()來判斷檔案的結束,現將有關用法總結如下:

定義eof是end of file 的縮寫,是c語言中標準庫中定義的巨集,定義為:#define  eof  (-1);  

feof() 用於測試流檔案的結束,有巨集和函式兩種定義:

巨集定義: #define feof(_stream)  ((_stream)->_flag & _ioeof),其中_ioeof的為:#define _ioeof 0x0010

函式定義:int feof( file *stream);

說明

eof的值為-1,是int型別資料,在32位系統中,可以表示為0xffffffff; eof 不是乙個字元,也不是檔案中實際存在的內容。eof不但能表示讀檔案到了結尾這一狀態,它還能表示 i/o 操作中的讀、寫錯誤(可以用 ferror() 來檢測)以及其它一些關聯操作的錯誤狀態;

feof()只用於測試流檔案的結束,當到達結尾時,返回非0;當檔案內部位置指標指向檔案結束時,並未立即置位file結構中的檔案結束標記,只有再執行一次讀檔案操作,才會置位結束標誌,此後呼叫feof才會返回為真。

函式如fgetc或getc返回eof並不一定表示檔案結束,當讀取檔案出錯時也會返回eof,僅憑返回-1就認為檔案結束是錯誤的;正因為如此,我們需要feof()來判斷檔案是否結束,當然用feof()來判斷檔案結束時也需要判斷讀取操作是否出錯,這時可以用ferror()來判斷,當其為真時表示有錯誤發生。在實際的程式中,應該每執行一次檔案操作,就用用ferror函式檢測是否出錯。

舉例假設檔案指標fp指向某個檔案,檔案中有字串「hello」,下面的**將輸出hello外,還將輸出乙個結束字元eof(eof是fgetc函式的返回值,並不是檔案中存在eof):

[cpp]view plain

copy

intc=0;  

while

(!feof(fp))    

其原因就是當內部指標指向結尾時,還要執行一次讀操作,檔案結束標記才置位,而下面的**將只輸出「hello」不輸出檔案結束符:

[cpp]view plain

copy

intc;  

c=fgetc(fp);      

while

(!feof(fp))    

當檔案內部指標指向結束位置時,先執行一次讀操作,置位檔案結束標記,while迴圈立即結束。

需要注意的幾點

(1) 位元組的讀取和寫入

fgetc或getc返回乙個int型別資料,在正常的情況下, fgetc或getc以 unsigned char 的方式讀取檔案流, 擴張為乙個整數,並返回. 換言之, fgetc 從檔案流中取乙個位元組, 並加上24個零,成為乙個小於256的整數,然後返回。

[cpp]view plain

copy

intc;  

while

((c = fgetc (rfp))!= -1) 

// -1就是 eof

fputc (c, wfp);  

在正常讀取的情況下, 上述fgetc函式返回的整數均小於256, 即0x0~0xff. 而讀不出 0xffffffff;而寫入時fputc 中的 c 雖然是整數, 但在 fputc 將其寫入檔案流之前, 又把整數的高24位去掉了, 所以如果用fputc把 0xffffffff 往檔案裡頭寫, 高24位被遮蔽,寫入的將是 0xff. 

(2) fgetc返回值的型別(以(1)中的**為例)

fgetc()返回型別為int,我們可以將其返回值賦給乙個int型別變數,如(1)中的**,即使是遇到字元0xff(blank的ascii碼,不是eof),while迴圈也不會結束,因為0xff會被轉化0x000000ff,顯然這與0xffffffff(eof)是不相等的,這時能完成正確複製;

如果用乙個char 型別的變數c 來接收fgetc()的返回值,會出現什麼情況? 假定下乙個讀取的字元為0xff 則:

char c = fgetc (rfp); // fgetc(rfp)的值為 0x000000ff, 然後強制轉化為char型別:c = 0xff

while(c != eof) ;     // 字元與整數比較? c 被帶符號(signed)擴充套件為0xffffffff,條件成立,檔案複製提前退出,故遇到空格字元時就退出,不能完成複製;

如果將c 定義為unsigned char,當讀到檔案末尾,返回 eof 也就是 -1 時:

unsigned char c = fgetc (rfp);// fgetc (rfp)的值為eof,即-1,即0xffffffff,然後強制轉化為uchar型別, c=0xff

while( c!= -1)  ;                        // c 被擴充套件為 0x000000ff, 永遠不會等於 0xffffffff,所以這次雖然能正確複製 0xff, 但卻不能判斷檔案結束. 事實上,在 c 為 uchar 時,c != -1 是永遠成立的!

因此,只能將c定義成int型別的變數,這樣才與fgetc返回型別一致。

C語言中的EOF

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

C語言中的EOF

本文是自己通過各種查閱以後的個人理解,如果有理解的地方還請大家多多指正!在做小演算法題目的時候經常用到eof,模模糊糊用但不清楚到底是什麼意思。後來遇到了問題進行了仔細了解。eof是end of file,也就是指 檔案 的結尾,這裡的檔案可以指檔案 file 也可以指輸入 stdin 可以說它是乙...

c語言中的getchar 和EOF

一 getchar的兩點總結 1.getchar是以行為單位進行訪問的。當用getchar進行輸入時,如果輸入的第乙個字元為有效字元 即輸入是檔案結束符eof,windows下為組合鍵ctrl z,unix linux下為組合鍵ctrl d 那麼只有當最後乙個輸入字元為換行符 n 也可以是檔案結束符...