23555666 发表于 2023-11-29 13:55:46

feof函数返回值不太正常

//声明:文件"abc"为空文件

#include <stdio.h>

int main() {
        FILE *file = fopen("abc", "r");// 打开一个文件
       
        if (file == NULL) {
                printf("无法打开文件\n");
                return 1;
        }
       
        // 检查文件是否为空
        if (feof(file)) {
                printf("文件为空\n");
        } else {
                printf("文件不为空\n");
        }
       
        fclose(file);// 关闭文件
        return 0;
}

//最后运行的结果为:文件不为空

求解释

FishC_GPT 发表于 2023-11-29 13:55:59

feof函数的返回值在流达到文件末尾时才会为真,所以在打开一个空文件后立即调用feof函数,它不会返回真。这是由于调用fopen函数只是打开了文件的句柄,并没有读取文件内容。

要检查文件是否为空,可以先读取文件的内容,然后再调用feof函数来判断是否达到文件末尾。以下是修改后的代码示例:

#include <stdio.h>

int main() {
    FILE *file = fopen("abc", "r");// 打开一个文件
   
    if (file == NULL) {
      printf("无法打开文件\n");
      return 1;
    }
   
    // 读取文件内容
    int c = fgetc(file);// 读取一个字符
   
    // 检查文件是否为空
    if (c == EOF) {
      printf("文件为空\n");
    } else {
      printf("文件不为空\n");
    }
   
    fclose(file);// 关闭文件
    return 0;
}

在这个示例中,我们使用了fgetc函数读取了文件的第一个字符,然后判断该字符是否等于EOF(End of File)来判断文件是否为空。如果文件为空,则feof函数的返回值应该为真。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

jackz007 发表于 2023-11-29 15:49:24

本帖最后由 jackz007 于 2023-11-29 21:29 编辑

      feof() 其实是用来测试读取文件内容的操作是否成功,在正常情况下,当采用读模式打开一个文件时,如果文件存在,文件的读写指针会位于文件的开头位置,读取文件的时候,会从读写指针的当前位置开始读取文件的内容,同时,读写指针也会随着此过程同步向文件尾部移动,移动的数值就是读取到的字节数。所以,读文件总是会引起读写指针向后移动,换句话说,如果读文件没有使读写指针向后移动,那么,就是读到文件结束位置了。所以,feof() 必须与读文件的操作配合使用,如果成功读取到了文件内容,那么,feof() 一定会返回 0 值,否则,返回非 0 值。
      对于一个空文件而言,文件的开头就是结尾,当从该文件中读取内容时,文件的读写指针无法移动,所以,读文件操作过后,使用 feof() 测试,一定会返回非 0 值。
【代码1】:
#include <stdio.h>

int main(void)
{
      FILE * file                                 ;
      if (file = fopen("abc" , "r")) {
                fgetc(file)                           ;
                if(feof(file)) printf("文件为空。\n") ; // feof() 返回非 0 值,代表读取文件的操作无效,读写指针没有移动。
                else printf("文件不为空。\n")         ;
                fclose(file)                        ;
      } else {
                printf("无法打开文件\n")            ;
      }
}

【代码2】:
#include <stdio.h>

int main(void)
{
      FILE * file                                 ;
      size_t filesize                               ; // size_t 其实就是 unsigned long long
      if((file = open("abc" , "rb"))) {               // 按二进制读的模式打开文件,这一点非常的关键。
                fseek(file , 0 , -1)                  ; // 把文件读写指针移动到文件结束的位置
                filesize = ftell(file)                ; // ftell() 会返回文件读写指针距离文件开头的偏移值,单位为字节。
                fclose(file)                        ;
                if(! filesize) printf("文件为空。\n") ; // 如果文件长度为 0
                else printf("文件不为空。\n")         ; // 否则
      } else {
                printf("无法打开文件\n");
      }
}

六翻了 发表于 2023-11-29 17:13:38

问题出在feof(file) 调用上。feof() 函数是用来检查文件是否达到结束位置的,也就是说,它用来检查文件是否已经读取到结尾。
如果文件是空的,那么在读取任何数据之前就已经到达了文件的结尾,所以 feof(file) 会返回非零值,这就导致你的程序错误地判断文件不为空。

要检查一个文件是否为空,你应该先读取文件,然后检查读取到的数据。
如果你只是想简单地检查文件是否存在并且是一个正常的文件(而不是一个目录或不存在的东西),你可以使用 fstat() 函数。
#include <stdio.h>

int main() {
    FILE *file = fopen("abc", "r");

    if (file == NULL) {
      printf("无法打开文件\n");
      return 1;
    }

    // 获取文件的大小
    fseek(file, 0, SEEK_END);
    long size = ftell(file);
    rewind(file);

    // 检查文件是否为空
    if (size == 0) {
      printf("文件为空\n");
    } else {
      printf("文件不为空\n");
    }

    fclose(file);
    return 0;
}
页: [1]
查看完整版本: feof函数返回值不太正常