複製鏈接
請複製以下鏈接發送給好友

feof

(函數名)

鎖定
feof是C語言標準庫函數,其原型在stdio.h中,其功能是檢測流上的文件結束符,如果文件結束,則返回非0值,否則返回0(即,文件結束:返回非0值;文件未結束:返回0值)。
中文名
feof()
類    型
c語言標準庫函數
功 能
檢測流上的文件結束
原 型
int feof(FILE *stream);
返回值
0或者非0
易混函數
“eof()”函數

feof函數名

feof

feof功 能

檢測流上的文件結束符
The function feof() tests the end-of-file indicator for the stream
pointed to by stream, returning non-zero if it is set. The end-of-file
indicator can only be cleared by the functionclearerr().
如果文件結束,則返回非0值,否則返回0,文件結束符只能被clearerr()清除。

feof用 法

int feof(FILE *stream);
參數
流 :FILE結構的指針 [1] 
注意:feof判斷文件結束是通過讀取函數fread/fscanf等返回錯誤來識別的,故而判斷文件是否結束應該是在讀取函數之後進行判斷。比如,在while循環讀取一個文件時,如果是在讀取函數之前進行判斷,則如果文件最後一行是空白行,可能會造成內存錯誤。

feof程序例

#include<stdio.h>
int main(void)
{
    FILE *stream;
    /*open a file for reading*/
    stream = fopen("DUMMY.FIL", "r");
    /*read a character from the file*/
    fgetc(stream);
    /*check for EOF*/
    if(feof(stream))
        printf("We have reached the end of file\n");
    /*close the file*/
    fclose(stream);
    return 0;
}
feof(fp)有兩個返回值:如果遇到文件結束,函數feof(fp)的值為非零值,否則為0。
ASCI C提供一個feof函數,用來判斷文件是否結束。
“C”語言的“feof()”函數和數據庫中“eof()”函數的運作是完全不同的。數據庫中“eof()”函數讀取當前指針的位置,“C”語言的“feof()”函數返回的是最後一次“讀操作的內容”。多年來把“位置和內容”相混,從而造成了對這一概念的似是而非。
那麼,位置和內容到底有何不同呢?舉個簡單的例子,比如有人説“你走到火車的最後一節車箱”這就是位置。而如果説“請你一直向後走,摸到鐵軌結束”這就是內容。也就是説用內容來判斷會“多走一節”。這就是完全依賴於“while(!feof(FP)){...}”進行文件複製時,目標文檔總會比源文檔“多出一些”的原因。
在“C”文件讀取操作時不能完全依賴於“while(!feof(FP)){...}”的判斷。下面代碼是改進後的代碼,該代碼執行後output文件內容和input文件內容一致,與使用“while(!feof(FP)){...}”相比,output文件的結尾符號(EOF)沒有被讀入到input文件中。
//main.c linux 下編譯通過、vc下也行。
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
    FILE *in, *out;
    int ch;
    if ((in = fopen("./output.txt", "r"))== NULL) //input.txt must exist in current directory.
    {
        fprintf(stderr, "Cannot open inputfile\n");
        exit(0);
    }
    if((out=fopen("./input.txt","w"))==NULL)
    {
        fprintf(stderr,"Can not open the file.\n");
        exit(0);
    }
    while(1)
    {
        ch=fgetc(in);
        if(ch == -1)
            break;
        fprintf(stdout,"The ASC of char %c is %d\n ",ch,ch);
        fputc(ch,out);
    }
    fclose(in);
    fclose(out);
    return 0;
}
與EOF的區別
stdio.h中可以看到如下定義:
#define EOF (-1)
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
int c;
while(!feof(fp))
{
    c = fgetc(fp);
    printf("%X\n", c);
}
會發現多輸出了一個FF,原因就是在讀完最後一個字符後,fp->flag仍然沒有被置為_IOEOF,因而feof()仍然沒有探測到文件結尾。直到再次調用fgetc()執行讀操作,feof()才能探測到文件結尾。這樣就多輸出了一個-1(即FF)。
正確的寫法應該是:
int c;
c = fgetc(fp);
while(!feof(fp))
{
    printf("%X\n", c);
    c = fgetc(fp);//最後一個c的值為-1,但是無妨,因為其他所有的循環操作都要放在此句話上面
}
feof()可以用EOF代替嗎?不可以。fgetc返回-1時,有兩種情況:讀到文件結尾或是讀取錯誤。因此我們無法確信文件已經結束, 因為可能是讀取錯誤! 這時我們需要feof()。
參考資料
  • 1.    feof  .微軟開發者社區MSDN資料[引用日期2016-09-30]