鱼C论坛

 找回密码
 立即注册
查看: 10992|回复: 12

[函数快查] feof -- 检测文件的末尾指示器是否被设置

[复制链接]
发表于 2017-7-17 01:22:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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;
}
搜狗截图20170717160503.png

考考你,为啥小甲鱼这里不直接将 while 循环写成下面这样:
……
        while (!feof(fp))
        {
                putchar(getc(fp));
        }
……

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-5 14:17:12 | 显示全部楼层
为什么啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-12 12:28:36 | 显示全部楼层

Inked捕获_LI.jpg

如图所示,出现乱码,但是为什么??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 11:28:58 | 显示全部楼层
我知道了,实测while(!feof(fp))总是会多读一次!虽然不理解为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-30 02:53:16 | 显示全部楼层

        while (!feof(fp))
        {
                putchar(getc(fp));
        }
这样写会多输出一次.

改成用if的形式可以在读取到文件结束的时候跳出以免多输出一次



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-31 04:10:15 | 显示全部楼层
因为fgetc每次只读取到1个字符,如果写成while (!feof(fp)) ,会因为fgetc少读取一个EOF,而造成了多读一次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-7 15:03:05 | 显示全部楼层
应该说具体差别在putchar哪里,因为feof是读取结尾是否被设置了,而fgetc是再读取了EOF之后才进行设置,所以是先设置,在读取,直接写成后面那样就会先设置一次,然后把EOF打印出来,而前面是先设置,在读取完了之后就退出循环,并没有打印出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-3-28 12:35:07 From FishC Mobile | 显示全部楼层
fgetc(fp)读到文件最后一个字符,此时ftell(fp)为a,还要继续读一次才能读到EOF
当fgetc(fp)读到EOF时,feof(fp)为16,ftell(fp)仍然为a,下次循环入口,判断值为0,跳出循环
多得一次循环,fp指向EOF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-28 10:41:33 | 显示全部楼层
会把eof读取出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 15:40:53 | 显示全部楼层
菜鸡一号 发表于 2019-1-7 15:03
应该说具体差别在putchar哪里,因为feof是读取结尾是否被设置了,而fgetc是再读取了EOF之后才进行设置,所 ...

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-25 11:56:14 | 显示全部楼层
老师57节课讲了,因为fgets函数在读到'\n'时会停止,并且保存在数组里。这时候光标已经到达文本中EOF之前,整个文档中就只有EOF未读取,再次进入循环时,根据fgets函数2. 如果还没读入任何字符就遇到这种 EOF,则 s 参数指向的位置保持原来的内容,函数返回 NULL。原来内容就是数组里的内容,会被再打印一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-19 14:49:52 | 显示全部楼层
为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-28 14:39:19 | 显示全部楼层
上面要不不看清题意,要么表述中错别字多;
简单来讲就是fgetc()函数必须读取EOF之后才能设置EOF指示器。
小甲鱼写的第一个就是当fgetc()读取完EOF之后,让feof()判断,此时EOF指示器已被设置,故进入
if (feof(fp)) {
    break;
}
直接就退出了!!!没有输出EOF。
------------------
而第二个,由于是putchar(fgetc(fp)),所以在fgetc()读取EOF之后,顺便把EOF输出了。然后再进行while (!feof(fp)) 判断,条件为假,退出循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表