首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fclose()总是返回EOF

fclose()总是返回EOF
EN

Stack Overflow用户
提问于 2012-08-04 03:47:03
回答 5查看 4.5K关注 0票数 2

我有一个函数,从文件中读取具有特定格式的整数。它可以正常工作,但是每当我试图用close ()关闭文件时,close()总是返回EOF。

有什么建议吗?我是个学生,还在学习。我已经把密码放在下面了。如果您需要“处理”代码,请告诉我。谢谢:)

代码语言:javascript
复制
// Open the file
FILE *myFile = fopen(fileName, "r");
if(myFile == NULL){
    //Handle error
    fprintf(stderr, "Error opening file for read \n");
    exit(1);
}

while(myFile != EOF)
{
     // read and process the file
     // this part works.
}

// always returns EOF here. WHY?
if (fclose(myFile) == EOF) {
    // Handle the error!
    fprintf(stderr, "Error closing input file.\n");
    exit(1);
}
printf("Done reading the file.");

编辑:谢谢你的回复。对不起,我不能发布代码,因为这是我的家庭作业的一部分。我只是想找人帮忙,我不是要你们帮我做密码。据我的教授说,发布代码是非法的(因为其他学生可以看到,而且很可能是复制的,这就是他告诉我的)。星期天之后我才能把密码发出去。现在,我将尝试修改我的代码,并避免使用fscanf。谢谢还有我的道歉。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-04 04:57:11

这是:

代码语言:javascript
复制
while(myFile != EOF)

实际上是非法的(违反约束)。任何符合标准的C编译器都必须发出诊断;默认情况下,gcc只发出警告(这确实是“诊断”)。

如果gcc给了你一个警告,你应该注意它;gcc经常对IMHO应该被视为致命错误的东西发出警告。如果它没有给出警告,您可能会使用禁用警告的选项来调用它(这很奇怪,因为它在默认情况下确实会产生警告)。一组很好的选项是-Wall -Wextra -std=c99 -pedantic (或者调整-std=...选项以强制执行不同版本的标准,如果您愿意的话)。

myFile是指针类型的,特别是FILE*EOFint类型的,通常扩展到(-1)。您不能合法地将指针值与整数值进行比较(除了空指针常量的特例,但在这里不适用)。

假设程序没有被拒绝,我希望这会导致一个无限循环,因为myFile几乎肯定永远不等于EOF

你可以把它改成

代码语言:javascript
复制
while (!feof(myFile))

但这可能会引起其他问题。在读取文件时检测文件结束的正确方法是使用您使用的任何函数返回的值,读取数据。请参阅您所使用的函数的文档,查看它在遇到文件末尾或错误条件时返回的内容。feof()函数对于在您完成阅读之后确定您是否遇到文件结束或错误条件非常有用。

票数 3
EN

Stack Overflow用户

发布于 2012-08-04 03:57:26

由于您无法对以只读模式打开的常规文件进行任何操作,从而导致fclose错误,所以您很可能在未显示的代码中出现了错误,这是对myFile结构的践踏。

而且,测试myFile != EOF永远不会是真的,因为您将它设置为fopen的返回,这将永远不会给您EOF,并且您已经检查了它的NULL,您的意思是:

代码语言:javascript
复制
while((c = fgetc(myFile)) != EOF) {
    // do stuff
}
票数 2
EN

Stack Overflow用户

发布于 2012-08-04 03:54:41

错误说了什么?将此添加到代码中:

代码语言:javascript
复制
#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);
}

希望能帮上忙。

致以问候。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11805758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档