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;
}
//最后运行的结果为:文件不为空
求解释 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 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");
}
} 问题出在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]