fclose()始终返回EOF
我有一个函数,可以从文件中读取特定格式的整数。 它可以根据需要正常工作,但每当我尝试使用fclose()关闭文件时, fclose()始终返回EOF 有什么建议吗?我是一名学生,还在学习。 我已经把代码放在下面了。如果您需要“处理”代码,请告诉我。谢谢:) 编辑:fclose()始终返回EOF,c,eof,fclose,C,Eof,Fclose,我有一个函数,可以从文件中读取特定格式的整数。 它可以根据需要正常工作,但每当我尝试使用fclose()关闭文件时, fclose()始终返回EOF 有什么建议吗?我是一名学生,还在学习。 我已经把代码放在下面了。如果您需要“处理”代码,请告诉我。谢谢:) 编辑: 谢谢你的回复。抱歉,我不能发布代码,因为这是我家庭作业的一部分。我只是想得到一些帮助,我不是要你们帮我写代码。根据我的教授的说法,发布代码是非法的(因为其他学生可以看到,可能也可以复制,这是他告诉我的)。我只能在星期天之后发布代码。现
谢谢你的回复。抱歉,我不能发布代码,因为这是我家庭作业的一部分。我只是想得到一些帮助,我不是要你们帮我写代码。根据我的教授的说法,发布代码是非法的(因为其他学生可以看到,可能也可以复制,这是他告诉我的)。我只能在星期天之后发布代码。现在,我将尝试修改我的代码并避免使用fscanf。谢谢你和我的道歉。厄尔诺说了什么?将此添加到您的代码中:
#include <errno.h>
#include <string.h>
if (fclose(myFile) == EOF) {
// Handle the error!
fprintf(stderr, "Error closing input file. and errno = %d, and error = %s\n", errno, strerror(errno));
exit(1);
}
#包括
#包括
if(fclose(myFile)==EOF){
//处理错误!
fprintf(stderr,“关闭输入文件时出错。错误号=%d,错误号=%s\n”,错误号,strerror(errno));
出口(1);
}
希望这有帮助
关于。由于您无法对以只读模式打开的常规文件执行任何操作,从而导致
fclose
出错,因此您很可能在未显示的代码中有一个错误,该错误正在对myFile
结构进行践踏
还有测试myFile!=EOF
将永远不会为真,因为您将其设置为fopen返回,而fopen将永远不会为您提供EOF
,并且您已经检查了它的NULL
您的意思是:
while((c = fgetc(myFile)) != EOF) {
// do stuff
}
如果这部分还可以的话
fclose(myFile);
一定要返回EOF。因为while循环只终止myFile==EOF(这是一个错误的比较,不要忽略警告)。指针和int之间的比较。因为EOF是stdio.h文件中定义的宏,根据glibc,它是-1。循环终止,这意味着myFile指针更改为EOF。这是您的错误
只需检查代码,就必须更改文件指针myFile,因为它指向文件结构,所以不应该被您重写
用于所有文件操作
注意
myFile是指向文件的指针,不应在任何赋值语句中用作左值 更改while(myFile!=EOF){…}
while(!feof(myFile)){…}myFile
是指向文件结构(内存地址)的指针。不是“文件结束”指示器。此:
while(myFile != EOF)
实际上是非法的(违反约束)。任何符合要求的C编译器都需要发出诊断;默认情况下,gcc只会发出警告(这确实符合“诊断”)
如果gcc给了你警告,你应该注意它;gcc经常对IMHO应被视为致命错误的内容发出警告。如果它没有给你一个警告,你可能会用禁用警告的选项来调用它(这很奇怪,因为默认情况下它会产生警告)。一组好的选项是-Wall-Wextra-std=c99-pedantic
(或者调整-std=…
选项以强制执行不同版本的标准,如果您愿意的话)
myFile
是指针类型,特别是FILE*
EOF
的类型为int
,通常扩展为(-1)
。您不能合法地将指针值与整数值进行比较(空指针常量的特殊情况除外,但此处不适用)
假设程序没有被拒绝,我希望这会导致无限循环,因为myFile
几乎肯定永远不会等于EOF
你可以把它改成
while (!feof(myFile))
但这可能会导致其他问题。读取文件时检测文件结尾的正确方法是使用正在使用的任何函数返回的值来读取数据。请参阅所使用函数的文档,查看它在遇到文件结尾或错误条件时返回的内容。
feof()myFile
是指针EOF
的类型为int
。比较它们几乎肯定会产生一个编译器诊断,您绝对不应该忽略它——而且很可能会导致一个无限循环。这让我觉得而(myFile!=EOF)
实际上并不在您的代码中。请给我们看真实的代码。@keithThompson这是我的代码,它工作起来很奇怪。但是我刚才(在看到你的评论后)把它改成了while(!feof(myFile))。Thanks@KeithThompson事实上这就是问题所在!代码工作正常。你能把你的评论贴出来吗?这样我就可以把它标记为答案了?Thankserror编号为0,表示“读取错误”。我会尝试谷歌什么原因,然后:)谢谢@DSUTADI:好的,如果你愿意的话,你可以发布你的代码,这样我们可以提供帮助。在我没有展示的代码中,我使用fscanf读取每个整数。我在好几个地方使用了fscanf。这可能是错误吗?通常,对于经常传递不指向分配空间的指针的C初学者来说,fscanf是指针错误的一大来源。这可以很容易地踩踏其他结构。@dsutadi只显示所有代码,而不是让所有人猜测。@dsutadi:阅读您调用的任何函数的文档都很有帮助。
while(myFile != EOF)
while (!feof(myFile))