feof -- 检测文件的末尾指示器是否被设置
feof 函数文档函数概要:
feof 函数用于检测文件的末尾指示器(end-of-file indicator)是否被设置。
函数原型:
#include <stdio.h>
...
int feof(FILE *stream);
参数解析:
参数含义
stream 该参数是一个 FILE 对象的指针,指定一个待检测的文件流
返回值:
1. 如果检测到末尾指示器(end-of-file indicator)被设置,返回一个非 0 值;
2. 如果检测不到末尾指示器(end-of-file indicator)被设置,返回值为 0。
备注:
1. feof 函数仅检测末尾指示器的值,它们并不会修改文件的位置指示器。
2. 文件末尾指示器只能使用 clearerr 函数清除。
演示:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if ((fp = fopen("file.txt", "r")) == NULL)
{
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}
while (1)
{
ch = fgetc(fp);
if (feof(fp))
{
break;
}
putchar(ch);
}
fclose(fp);
return 0;
}
考考你,为啥小甲鱼这里不直接将 while 循环写成下面这样:
……
while (!feof(fp))
{
putchar(getc(fp));
}
……
为什么啊? 雨天云 发表于 2018-1-5 14:17
为什么啊?
如图所示,出现乱码,但是为什么?? 我知道了,实测while(!feof(fp))总是会多读一次!虽然不理解为什么?
while (!feof(fp))
{
putchar(getc(fp));
}
这样写会多输出一次.
改成用if的形式可以在读取到文件结束的时候跳出以免多输出一次
因为fgetc每次只读取到1个字符,如果写成while (!feof(fp)) ,会因为fgetc少读取一个EOF,而造成了多读一次。 应该说具体差别在putchar哪里,因为feof是读取结尾是否被设置了,而fgetc是再读取了EOF之后才进行设置,所以是先设置,在读取,直接写成后面那样就会先设置一次,然后把EOF打印出来,而前面是先设置,在读取完了之后就退出循环,并没有打印出来 fgetc(fp)读到文件最后一个字符,此时ftell(fp)为a,还要继续读一次才能读到EOF
当fgetc(fp)读到EOF时,feof(fp)为16,ftell(fp)仍然为a,下次循环入口,判断值为0,跳出循环
多得一次循环,fp指向EOF 会把eof读取出来 菜鸡一号 发表于 2019-1-7 15:03
应该说具体差别在putchar哪里,因为feof是读取结尾是否被设置了,而fgetc是再读取了EOF之后才进行设置,所 ...
厉害
老师57节课讲了,因为fgets函数在读到'\n'时会停止,并且保存在数组里。这时候光标已经到达文本中EOF之前,整个文档中就只有EOF未读取,再次进入循环时,根据fgets函数2. 如果还没读入任何字符就遇到这种 EOF,则 s 参数指向的位置保持原来的内容,函数返回 NULL。原来内容就是数组里的内容,会被再打印一次{:10_249:} 为什么? 上面要不不看清题意,要么表述中错别字多;
简单来讲就是fgetc()函数必须读取EOF之后才能设置EOF指示器。
小甲鱼写的第一个就是当fgetc()读取完EOF之后,让feof()判断,此时EOF指示器已被设置,故进入
if (feof(fp)) {
break;
}
直接就退出了!!!没有输出EOF。
------------------
而第二个,由于是putchar(fgetc(fp)),所以在fgetc()读取EOF之后,顺便把EOF输出了。然后再进行while (!feof(fp)) 判断,条件为假,退出循环。
页:
[1]