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()的问题

大家在使用C++写操作文件的程序时,一定使用过eof()这个函数,用它来判别文件结束,但有不少也用来判别文件是否为空的.但是,这样操作的结果不是我们所想的.看下面程序:#include string>...
  • fengzi_shen
  • fengzi_shen
  • 2008年03月19日 16:24
  • 2625

EOF

>> 关于文件结束符EOF EOF 是 End Of File 的缩写。 在C语言中,它是在标准库中定义的一个宏。 人们经常误认为 EOF 是从文件中读取的一个字符(牢记)。其实,EOF...
  • s200820212
  • s200820212
  • 2013年08月26日 08:30
  • 1527

C++中的文件尾条件--EOF

C++中的文件尾条件–EOFC++中一般的输入方式有两种,一种是cin,一种是从文件中输入。cin就不在此介绍了,而文件输入需要关心的是,文件尾条件EOF的结束标志,在学习C语言的时候,在文件操作那一...
  • huichangxindong
  • huichangxindong
  • 2017年09月17日 13:54
  • 130

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

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

C语言再学习 -- EOF、feof函数、ferror函数

EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。 EOF不是特殊字符,而是一个定义在头文件stdi...
  • qq_29350001
  • qq_29350001
  • 2016年11月09日 15:47
  • 3728

关于EOF

在做完mini6410移植全攻略后,打算把自己以前的linux c笔记,贴出来和大家共享,有不对支持希望大家指出,谢谢!! 转载请注明出处:http://blog.csdn.net/muge09...
  • jidonghui
  • jidonghui
  • 2012年03月08日 12:10
  • 365

EOF是什么?

我学习C语言的时候,遇到的一个问题就是EOF。 它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。...
  • stone_riding
  • stone_riding
  • 2015年03月26日 11:04
  • 330

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

stdio.h中有如下定义:#define EOF (-1)#define _IOEOF          0x0010#define feof(_stream)     ((_stream)->_f...
  • ludonghai715
  • ludonghai715
  • 2011年06月10日 10:58
  • 1035

C中的 feof() 和 EOF

以linux平台下的vim创建的文件为例,当读取指定文件中的内容时,文件的格式为: 内容+EOF  其中 EOF为vim文件内容的结束标志。 每当用C语言读取文件内容时,文件指针要指向字符EO...
  • misskissC
  • misskissC
  • 2012年11月24日 16:55
  • 6794

EOF 键盘输入end of file

 Entering an End-of-file from the Keyboard从键盘输入文件结束符 Operating systems use different values for ...
  • qianshanxue11
  • qianshanxue11
  • 2016年11月03日 14:34
  • 665
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C中判断文件结束的两种方法feof()和EOF
举报原因:
原因补充:

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