小甲鱼 发表于 2017-7-17 01:22:07

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:12

为什么啊?

Ruide 发表于 2018-1-12 12:28:36

雨天云 发表于 2018-1-5 14:17
为什么啊?



如图所示,出现乱码,但是为什么??

雨天云 发表于 2018-1-16 11:28:58

我知道了,实测while(!feof(fp))总是会多读一次!虽然不理解为什么?

BIGLUO 发表于 2018-5-30 02:53:16


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

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



sswy 发表于 2018-7-31 04:10:15

因为fgetc每次只读取到1个字符,如果写成while (!feof(fp)) ,会因为fgetc少读取一个EOF,而造成了多读一次。

菜鸡一号 发表于 2019-1-7 15:03:05

应该说具体差别在putchar哪里,因为feof是读取结尾是否被设置了,而fgetc是再读取了EOF之后才进行设置,所以是先设置,在读取,直接写成后面那样就会先设置一次,然后把EOF打印出来,而前面是先设置,在读取完了之后就退出循环,并没有打印出来

老虎是个莘莘 发表于 2021-3-28 12:35:07

fgetc(fp)读到文件最后一个字符,此时ftell(fp)为a,还要继续读一次才能读到EOF
当fgetc(fp)读到EOF时,feof(fp)为16,ftell(fp)仍然为a,下次循环入口,判断值为0,跳出循环
多得一次循环,fp指向EOF

hhdxzz 发表于 2021-6-28 10:41:33

会把eof读取出来

旭仔didi 发表于 2021-12-24 15:40:53

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

厉害

菜子 发表于 2022-3-25 11:56:14

老师57节课讲了,因为fgets函数在读到'\n'时会停止,并且保存在数组里。这时候光标已经到达文本中EOF之前,整个文档中就只有EOF未读取,再次进入循环时,根据fgets函数2. 如果还没读入任何字符就遇到这种 EOF,则 s 参数指向的位置保持原来的内容,函数返回 NULL。原来内容就是数组里的内容,会被再打印一次{:10_249:}

Saito77 发表于 2023-12-19 14:49:52

为什么?

Husj0711 发表于 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)) 判断,条件为假,退出循环。
页: [1]
查看完整版本: feof -- 检测文件的末尾指示器是否被设置