首先來看他們兩個的定義:
#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()
函數時候也得注意一個問題,如果用的不小心,會多出一個字節數據,詳情見這裏