feof()函数

把一个包含整数(用空格隔开)的文件读到终端,却发现每次最后一个整数多读了一次。没道理呀,明明读到文件结尾了,为什么feof()函数返回的还是0。而再次调用feof()函数时,才会返回1。
百度一下发现feof()函数的特殊之处。搜集些关于feof的说明,贴在这儿供大家参考,也方便自己日后查看。
看看在Windows上Visual C++里的情况:

在stdio.h里有feof的定义:
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
关于宏定义的说明:
  这里不是带参数的宏定义么,为什么要叫它函数呢?这是不严格的叫法,大家是否还记得谭老的《C语言程序设计》第十三章第四节中,关于文件的读写函数fputs函数的说明,在stdio.h文件中有#define putchar(c) fputc(c,stdout)
用宏putchar(c)比写fputc(c,stdout)简单一些,从用户的角度,可以把putchar(c)看作是函数而不必严格地称它为宏。那么sizeof呢,是什么?函数?关键字?预定义宏?

 在上述宏定义中,只有当fp->_flag & 0x0010为真时,才认为文件结束了。在VC里,只有当file position indicator(在Windows上是fp->_ptr)到了文件末尾,然后再发生读/写操作时,fp->_flag才会被置为含有_IOEOF,然后再调用feof(),才会得到文件结束的信息。并不是file position indicator一指到文件尾,feof()就认为文件结束。
关于feof()函数的说明:
  feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为1,否则为0。

       EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0x1A(十进制为26),因此可以用EOF作为文件结束标志。当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。

 C语言的“feof()”函数和数据库中“eof()”函数的运做是完全不同的。数据库中“eof()”函数读取当前指针的位置,“C”语言的“feof()”函数返回的是最后一次“读操作的内容”。很多人把“位置和内容”相混,从而造成了对这一概念的似是而非。那么,位置和内容到底有何不同呢?举个简单的例子,比如有人说“你走到火车的最后一节车箱”这就是位置。而如果说“请你一直向后走,摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){...}”进行文件复制时,目标文档总会比源文档“多出一些”的原因。  

 在“C”文件读取操作时不能完全依赖于“while(!feof(FP)){...}”的判断。下面代码是改进后的代码,该代码执行后output文件内容和input文件内容一致,与使用“while(!feof(FP)){...}”相比,input文件的结尾符号(EOF)没有被读入到output文件中。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值