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()函数时候也得注意一个问题,如果用的不小心,会多出一个字节数据,详情见这里

你可能感兴趣的:(基础,C语言,C,EOF,feof())