首先来看他们两个的定义:
#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()
函数时候也得注意一个问题,如果用的不小心,会多出一个字节数据,详情见这里