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

原创 2013年11月17日 10:31:56

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

 

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

  1. #define EOF (-1)  
  2. #define _IOEOF 0x0010  
  3. #define feof(_stream) ((_stream)->_flag & _IOEO  

由此可以看出,这两种方式的原理是不同的。
有人说EOF只能用于文本文件,其实不然,还要看定义的变量的类型。下面这段程序对文本文件和二进制文件都可以:

  1. int c;  
  2. while((c=fgetc(fp)) != EOF)  
  3. {  
  4.     printf("%X/n", c);  
  5. }  

如果读到了FF,由于c定义为int型,所以实际上c=0x000000FF,不等于EOF(-1=0xFFFFFFFF),因此不会误判为文件结尾。
但是如果把c定义为char类型,就有可能产生混淆了。

  1. char c;  
  2. while((c=fgetc(fp)) != EOF)  
  3. {  
  4.     printf("%X/n", c);  
  5. }  

因为文本文件中存储的是ASCII码,而ASCII码中FF代表空值(blank),一般不使用,所以如果读文件返回了FF,说明已经到了文本文件的结尾。但是如果是二进制文件,其中可能会包含FF,因此不能把读到EOF作为文件结束的条件,此时只能用feof()函数。
在VC里,只有当文件位置指针(fp->_ptr)到了文件末尾,然后再发生读/写操作时,标志位(fp->_flag)才会被置为含有_IOEOF。然后再调用feof(),才会得到文件结束的信息。因此,如果运行如下程序:

  1. char c;  
  2. while(!feof(fp))  
  3. {  
  4.     c = fgetc(fp);  
  5.     printf("%X/n", c);  
  6. }  

会发现多输出了一个FFFFFFFF,原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FFFFFFFF)。
正确的写法应该是:

  1. char c;  
  2. c = fgetc(fp);  
  3. while(!feof(fp))  
  4. {  
  5.     printf("%X/n", c);  
  6.     c = fgetc(fp);  
  7. }  
 


这么说其实feof()是可以用EOF来代替的喽?不是,这里还有一个问题。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误! 这时我们需要feof()。

相关文章推荐

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

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

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

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

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

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

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

原文地址:http://blog.csdn.net/bingqing07/article/details/5785080/ 昨天突然被一位朋友问到了关于文件结尾的程序问题。在用feof()判断文...

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

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

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

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

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

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

文件检测函数 feof, ferror,clearerr C库函数

文件检测函数 C语言中常用的文件检测函数有以下几个。 一、文件结束检测函数feof函数调用格式: feof(文件指针); 功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。 二、...

C语言中的检测文件流是否结束的函数feof

函数名: feof 功  能: 检测流上的文件结束符 用  法: int feof(FILE *stream); feof - 程序例 #include i...
  • yuanya
  • yuanya
  • 2014年04月24日 15:13
  • 1048

关于使用fseek函数之后feof函数无法结束文件的警告 http://bbs.csdn.net/topics/390759596

发表于: 2014-04-14 18:26:09 c语言c++ 近期刚学到fseek函数,可是遇到了难题。用了fseek函数后,再feof函数判断文件结束。但是打死也判断走不出循环。搞得我...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C中判断文件结束的两种方法feof()和EOF
举报原因:
原因补充:

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