最近degug 一个程序,给我郁闷坏了。大家都来看看。
这是一个小测试程序
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch;
FILE *fp;
if((fp=fopen("1", "r")) == NULL)
{
printf("Cann't open file 1\n");
exit (-1);
}
while(!feof(fp))
{
ch = fgetc(fp);
putchar(ch);
}
putchar('\n');
return 0;
}
|
大家可以在自己的机子上跑一下。
如果文件1里面是字符: guanxieguojia
输出的结果是真确的吗?
非也!
这是为什么?
其实这就是个细节问题,让feof()给耍了。
附上feof()函数的源码
#include <errno.h>
#include <stdio.h>
#undef feof
#undef feof_unlocked
/* Return non-zero if STREAM has its EOF indicator set. */
int
feof (stream)
FILE *stream;
{
if (!__validfp (stream))
{
__set_errno (EINVAL);
return -1;
}
return stream->__eof;
}
|
不知大家看明白没?我太菜,没看明白。
我经过反复查阅终于明白了。
原来feof()函数判断文件是否结束的时候,当前文件指针指向文件结尾时, feof()返回的还是0,当下一次
试图访问文件的时候,它才会返回一,这时候大家再看上面的测试代码应该就明白了吧!
最后那个多出来的字符是EOF,也就是-1.
什么?不信? 自己打出来看看就知道了。