EOF和feof

转载 2015年07月08日 17:56:33

查看 stdio.h 可以看到如下定义:

 

#define  EOF  (-1)

 

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

 

由此可以看出,这两种方式的原理是不同的。

 

在这里先说下EOF和feof()这个两个宏定义,在我们学的课本中有这样的描述。

EOF是不可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于EOF时,表示读入的已不是正常的字符而是文件结束符,但这适用对文本文件的读写。在二进制文件中,信息都是以数值方式存在的。EOF的值可能就是所要处理的二进制文件中的信息。这就出现了需要读入有用数据却被处理为“文件结束“的情况。为了解决这个问题,C提供了一个feof()函数,可以用它来判断文件是否结束。feof(fp)用于测试fp所指向的文件的当前状态是否为“文件结束”。如果是,函数则返回的值是1(真),否则为0(假)。

 

说了这两个的定义,肯定还对二进制文件和文本文件的区别有些模糊(唉,因为我当时就对这些搞不懂),那现在就回顾下这两个文件的概念。C语言支持的是流式文件,它把文件看作由一个一个的字符(字节)数据组成的序列。根据数据的组织和操作形式,可以分为ASCII文件和二进制文件。

ASCII文件又称为文本文件,它是在一个字节的存储单元上存放一个字符(在外存中存放的是该字符的ASCII码,每个字符将占一个字节)。

二进制文件是把内存中的数据按其在内存中的存储格式在磁盘上原样保存。 

对字符而言,由于其外存存储格式和内存表示格式相同,所以,在外存上也存放每个字符的ASCII码。

 

 


但是说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); 
}
会发现多输出了一个FF,原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。


正确的写法应该是:
char c;
c = fgetc(fp);
while(!feof(fp))
{
printf("%X/n", c); 
c = fgetc(fp);

相关文章推荐

feof()和EOF的用法—— C中文件结尾的判断

昨天突然被一位朋友问到了关于文件结尾的程序问题。在用feof()判断文件时,复制会多产生一个字符。   这个问题在大一的时候,老师上课就强调过,但那时只是模糊的记得个大概,记得这个函数如果用的不对...
  • rznice
  • rznice
  • 2012年01月18日 13:43
  • 20088

feof()和EOF的用法—— C中文件结尾的判断

查看 stdio.h 可以看到如下定义: #define  EOF  (-1) #define  _IOEOF  0x0010 #define  feof(_stream)  ((_strea...

feof()函数以及EOF

c 中的feof()函数以及EOF的用法和区别

feof()和EOF的用法—— C中文件结尾的判断

昨天突然被一位朋友问到了关于文件结尾的程序问题。在用feof()判断文件时,复制会多产生一个字符。 这个问题在大一的时候,老师上课就强调过,但那时只是模糊的记得个大概,记得这个函数如果用的不...

C语言中的EOF和feof()

在c语言中经常用EOF和feof()来判断文件的结束,现将有关用法总结如下: 定义 EOF是End Of File 的缩写,是c语言中标准库中定义的宏,定义为:#define  EOF  (-...

判断文件结束有两种方法:EOF和feof()

判断文件结束有两种方法:EOF和feof()   查看stdio.h可以看到如下定义: [cpp] view plaincopyprint? ...

<转>feof()和EOF用法

查看 stdio.h 可以看到如下定义:   #define  EOF  (-1)   #define  _IOEOF  0x0010  #define  feof(_str...

feof()和EOF的用法—— C语言中文件结尾的判断 (个人感觉写的挺深刻)

昨天突然被一位朋友问到了关于文件结尾的程序问题。在用feof()判断文件时,复制会多产生一个字符。   这个问题在大一的时候,老师上课就强调过,但那时只是模糊的记得个大概,记得这个函数如果...

C中判断文件结束的两种方法feof()和EOF

判断文件结束有两种方法:EOF和feof()   查看stdio.h可以看到如下定义: [cpp] view plaincopyprint? #define EOF...

linux C编程中EOF宏和feof函数的用法

在c语言中经常用EOF和feof()来判断文件的结束,现将有关用法总结如下: 定义 EOF是End Of File 的缩写,是c语言中标准库中定义的宏,定义为:#define  EOF...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EOF和feof
举报原因:
原因补充:

(最多只允许输入30个字)