關於feof機制的詳解

關於feof機制的詳解

遇到的問題

在擼代碼的時候遇到一個問題,使用feof(fp)做爲文件結束檢測,使用fscanf讀取文件,但是往往會
讀取最後一行兩次。
測試文檔如下:
在這裏插入圖片描述
測試代碼如下:

#include <stdio.h>
#include <string.h>
int main()
{
    char StrTmp[80];
    memset(StrTmp,0,sizeof(StrTmp));
    FILE *fp;
    fp=fopen("test.txt","r");
    while(!feof(fp))
    {
        fscanf(fp,"%s",StrTmp);
        printf("%s\n\n",StrTmp);
    }
    fclose(fp);
    return 0;
}

測試結果如下:
在這裏插入圖片描述
從結果上來看,test4輸出了兩次,然而我只需要輸出一次。

詳解

查詢feof命令原型

man feof

結果如下:
在這裏插入圖片描述
由此我們知道feof的函數原型

int feof(FILE *stream);

feof的作用

  • The function feof() tests the end-of-file indicator for the stream pointed to by stream, returning nonzero if it is set. The end-of-file indicator can be cleared only by the function clearerr().

feof會檢測文件指針是否到達文件末尾,如果到了,返回一個非零值。

注意:feof函數讀取文件最後一個字符的時候依然會返回0,表明沒有到達文件結尾,只有再往後讀取字符(越過最後一個字符),feof()纔會返回一個非零值,表示到達文件結尾。
測試代碼

#include <stdio.h>
#include <string.h>
int main()
{
    char StrTmp[80];
    memset(StrTmp,0,sizeof(StrTmp));
    FILE *fp;
    fp=fopen("test.txt","r");
    while(!feof(fp))
    {
        fscanf(fp,"%s",StrTmp);
        if(feof(fp))
        {
            break;
        }
        printf("%s\n\n",StrTmp);
    }
    fclose(fp);
    return 0;
}

執行結果
在這裏插入圖片描述
能夠正常執行。
這個問題出在對結束檢測的不精準,feof行進過程類似於,一個機器人在火車上從頭往後走,前進一個格子,打兩邊的人(fscanf()),一人一耳光,如果有人,喊一聲(返回0),如果沒人,喊大一聲(返回1),但它確定有沒有人,是先打才能確定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章