關於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),但它確定有沒有人,是先打才能確定。