鱼C论坛

 找回密码
 立即注册
查看: 3448|回复: 6

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

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

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

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

x
feof 函数文档


函数概要:

feof 函数用于检测文件的末尾指示器(end-of-file indicator)是否被设置。


函数原型:

  1. #include <stdio.h>
  2. ...
  3. int feof(FILE *stream);
复制代码


参数解析:

参数
含义
stream 该参数是一个 FILE 对象的指针,指定一个待检测的文件流


返回值:

1. 如果检测到末尾指示器(end-of-file indicator)被设置,返回一个非 0 值;

2. 如果检测不到末尾指示器(end-of-file indicator)被设置,返回值为 0。


备注:

1. feof 函数仅检测末尾指示器的值,它们并不会修改文件的位置指示器。

2. 文件末尾指示器只能使用 clearerr 函数清除。


演示:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.         FILE *fp;
  6.         int ch;

  7.         if ((fp = fopen("file.txt", "r")) == NULL)
  8.         {
  9.                 printf("打开文件失败!\n");
  10.                 exit(EXIT_FAILURE);
  11.         }

  12.         while (1)
  13.         {
  14.                 ch = fgetc(fp);

  15.                 if (feof(fp))
  16.                 {
  17.                         break;
  18.                 }

  19.                 putchar(ch);
  20.         }

  21.         fclose(fp);

  22.         return 0;
  23. }
复制代码

搜狗截图20170717160503.png

考考你,为啥小甲鱼这里不直接将 while 循环写成下面这样:

  1. ……
  2.         while (!feof(fp))
  3.         {
  4.                 putchar(getc(fp));
  5.         }
  6. ……
复制代码


想知道小甲鱼最近在做啥?请访问 -> 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
发表于 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2021-1-16 10:42

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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