在网上看到一个关于feof()函数的帖子,说的是文件结束符EOF的问题,但是有些问题验证不清楚,
C语言新手,由于对文件IO这块一直不是很清楚,我想请教一下我的理解是否正确:getc()在读取最后一个字符后fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。而gets()函数读取最后一个字符后,fps->flag直接被置为_IOEOF?
直接上代码了
代码1
char buf[20];
FILE *fps;
fps=fopen("./test.txt","r");//文件内容为"abc"3个字幕
char c;
while(!feof(fps))
{
c = fgetc(fps);
printf("%x\n", c);
}
fclose(fps);
这段代码的输出为
61
62
63
ffffffff
后面这个fffffff是因为多打印了一个文件结束符EOF,原因就是在读完最后一个字符后,fps->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。解决方法是先进行c = fgetc(fps)读取,再判断,即:
char c = fgetc(fps);
while(!feof(fps))
{
printf("%x\n", c);
c = fgetc(fps);
}
已验证的确是这样
有人说用gets()函数也会出现此问题
代码2
fps=fopen("./test.txt","r");
while(!feof(fps))
{
fgets(buf,20,fps);
fputs(buf,stdout);
}
fclose(fps);
说这段代码会把文件最后一行的内容打印两遍,原因同上,但是我测试代码1的确会多打印一个结束符(FF),但是代码2一切正常不会打印两遍.是我的验证方式有问题吗