鱼C论坛

 找回密码
 立即注册
查看: 1232|回复: 3

[已解决]feof函数返回值不太正常

[复制链接]
发表于 2023-11-29 13:55:46 | 显示全部楼层 |阅读模式

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

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

x
//声明:文件"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;  
}

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

求解释
最佳答案
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");  
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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");  
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;  
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 10:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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