EOF和feof()區別

首先來看他們兩個的定義:

#define EOF (-1)

#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)

EOF是不可輸出字符,因此不能在屏幕上顯示。由於字符的ASCII碼不可能出現-1,因此EOF定義爲-1是合適的。當讀入的字符值等於EOF時,表示讀入的已不是正常的字符而是文件結束符,但這適用對文本文件的讀寫。

在二進制文件中,信息都是以數值方式存在的。EOF的值可能就是所要處理的二進制文件中的信息。這就出現了需要讀入有用數據卻被處理爲“文件結束“的情況。爲了解決這個問題,C提供了一個feof()函數,可以用它來判斷文件是否結束。feof(fp)用於測試fp所指向的文件的當前狀態是否爲“文件結束”。如果是,函數則返回的值是1(真),否則爲0(假)。

下面這段程序對文本文件和二進制文件都可以:

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()函數。

但是,用feof()函數時候也得注意一個問題,如果用的不小心,會多出一個字節數據,詳情見這裏

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