标签:
今天遇到了feof()判断文件结束多输出一行的问题,在网上看到一篇写得比较好的文章,转过来(誊写一遍)加深印象。原文地址:http://blog.csdn.net/flyyyri/article/details/5084981
1、EOF是标准库中的宏定义,#define EOF -1,在32位系统中是int型数据,表示为0xFFFFFFFF,EOF 不是一个字符,也不是文件中实际存在的内容。EOF不但能表示读文件到了结尾这一状态,它还能表示 I/O 操作中的读、写错误(可以用 ferror() 来检测)以及其它一些关联操作的错误状态;
2、feof()只用于测试流文件的结束,当到达结尾时,返回非0;当文件内部位置指针指向文件结束时,并未立即置位FILE结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用feof才会返回为真。
下面是来自百度百科的一段说明:
int c=0; while(!feof(fp)) { int c=fgetc(fp); printf("%c:\t%x\n",c,c); }
其原因就是当内部指针指向结尾时,还要执行一次读操作,文件结束标记才置位,而下面的代码将只输出“hello”不输出文件结束符:
int c; c=fgetc(fp); while(!feof(fp)) { printf("%c:/t%x/n",c,c); c=fgetc(fp); }
当文件内部指针指向结束位置时,先执行一次读操作,置位文件结束标记,while循环立即结束。
2、一般情况下,多读一行没有多大影响,在循环外把最后一条记录删掉即可
标签:
原文地址:http://www.cnblogs.com/nvbxmmd/p/4709480.html