EOF與feof(),文件末尾的判定方法

 

判斷文件結束有兩種方法:EOF和feof()
查看stdio.h可以看到如下定義:
#define EOF (-1)
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
由此可以看出,這兩種方式的原理是不同的。
有人說EOF只能用於文本文件,其實不然,還要看定義的變量的類型。下面這段程序對文本文件和二進制文件都可以:
int c;
while((c=fgetc(fp)) != EOF)
{
printf("%X/n", c);
}
如果讀到了FF,由於c定義爲int型,所以實際上c=0x000000FF,不等於EOF(-1=0xFFFFFFFF),因此不會誤判爲文件結尾。
但是如果把c定義爲char類型,就有可能產生混淆了。
char c;
while((c=fgetc(fp)) != EOF)
{
printf("%X/n", c);
}
因爲文本文件中存儲的是ASCII碼,而ASCII碼中FF代表空值(blank),一般不使用,所以如果讀文件返回了FF,說明已經到了文本文件的結尾。但是如果是二進制文件,其中可能會包含FF,因此不能把讀到EOF作爲文件結束的條件,此時只能用feof()函數。
在VC裏,只有當文件位置指針(fp->_ptr)到了文件末尾,然後再發生讀/寫操作時,標誌位(fp->_flag)纔會被置爲含有_IOEOF。然後再調用feof(),纔會得到文件結束的信息。因此,如果運行如下程序:
char c;
while(!feof(fp))
{
c = fgetc(fp);
printf("%X/n", c);
}
會發現多輸出了一個FFFFFFFF,原因就是在讀完最後一個字符後,fp->flag仍然沒有被置爲_IOEOF,因而feof()仍然沒有探測到文件結尾。直到再次調用fgetc()執行讀操作,feof()才能探測到文件結尾。這樣就多輸出了一個-1(即FFFFFFFF)。
正確的寫法應該是:
char c;
c = fgetc(fp);
while(!feof(fp))
{
printf("%X/n", c);
c = fgetc(fp);
}
這麼說其實feof()是可以用EOF來代替的嘍?不是,這裏還有一個問題。fgetc返回-1時,有兩種情況:讀到文件結尾或是讀取錯誤。因此我們無法確信文件已經結束, 因爲可能是讀取錯誤! 這時我們需要feof()。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章