一、feof的定義
feof()是檢測流上的文件結束符的函數,如果文件結束,則返回非0值,否則返回0;
原型:int feof ( FILE * stream );
一般在操作中,經常用feof()判斷文件是否結束。檢查是否設置了與流關聯的文件結束指示符,如果返回,則返回一個不同於零的值。該指示符通常由嘗試在文件末尾讀取的流上的先前操作設置。注意,流的內部位置指示符可能指向下一個操作的文件結尾,但是,直到操作試圖在該點讀取之前,文件結尾指示符可能才被設置。可以通過調用clearerr,倒帶,fseek,fsetpos或freopen清除此指示符。儘管如果這樣的調用未重新定位位置指示器,則下一個I / O操作可能會再次設置指示器。
二、經典用法
* feof example: byte counter */
#include <stdio.h>
int main ()
{
FILE * pFile; //用於存儲文件地址
int n = 0; //計數
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
while (fgetc(pFile) != EOF) {
++n;
}
if (feof(pFile)) {
puts ("End-of-File reached.");
printf ("Total number of bytes read: %d\n", n);
}
else puts ("End-of-File was not reached.");
fclose (pFile);
}
return 0;
功能分析:此代碼將打開名爲myfile.txt的文件,並通過逐個讀取所有字符來計算其中包含的字符數。程序檢查是否到達文件末尾,如果達到,則打印讀取的字節總數。
三、經典錯誤
#include<stdio.h>
int main(void)
{
FILE *p;
p = fopen("open.txt", "r");
if (feof(p))
{
printf("文件爲空。");
}
else
{
printf("文件不爲空。");
}
return 0;
}
**分析:**根據這個函數的定義,一般大家都是這樣使用的,但是這樣使用,文件中無論是否有內容,都會被判斷爲“文件不爲空”(跟文件打開方式也有關)。
四、feof()原理
1.EOF(宏定義)
EOF是一個計算機術語,爲End Of File的縮寫,在操作系統中表示資料源無更多的資料可讀取。
資料源通常稱爲檔案或串流。通常在文本的最後存在此字符表示資料結束。
在文檔的結尾都有一個隱藏字符”EOF”,當程序讀取它的時候,就會知道文件已經到達結尾。通常使用while循環加EOF判斷作爲讀取結束的標誌。
EOF 的值通常爲 -1,但它依系統有所不同。
2.feof()
- feof()原理函數:,並不是通過讀取到文件的EOF來評判,這個文件是否爲空。對feof()來說,它的工作原理是,站在光標所在位置,向後看看還有沒有字符。如果有,返回0;如果沒有,返回非0。它並不會讀取相關信息,只是查看光標後是否還有內容。
- 直接使用時:對於一個空文件來說,當程序打開它的時候,它的光標會停在文件的開頭,但是由於文件裏什麼內容都沒有存(但是EOF是存在的),即整個文件就存貯了一個EOF。當程序打開文件,並直接調用feof()時,這個函數就會站在光標的位置向後張望,結果就看見了EOF,然後就當然返回0了。
五、上程序改正
#include<stdio.h>
int main(void)
{
FILE *p;
p = fopen("open.txt", "r");
getc(p);
if (feof(p))
{
printf("文件爲空。");
}
else
{
rewind(p);//將光標跳回到文件開頭
int a;
fscanf(p,"%d",&a);
printf("%d", a);
}
return 0;
}
總結:
- 對於文件來說,無論是空文件,還是存有信息的文件,當文件被打開,光標處於默認的開頭時,光標後都有信息,這時候調用feof()來查看光標後是否還有內容,就沒意義。
- 所以我們需要從相同中找不同,先使用getc(),從文件中讀取一個字符,讓光標向後移動一個字符。這時空文件的光標就已經移動到EOF的後面,這時使用feof()就會返回1了。這纔是feof()的正確用法。
- 但是要注意,一定要將光標回到文件的開頭,因爲之前判斷文件是否爲空時,將光標向前移動了一位,必須要將光標恢復到開頭,這樣才能保證文件的正常讀取。