fclose()总是返回EOF

时间:2012-08-04 03:47:04

标签: c eof fclose

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

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

// 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。谢谢,我的道歉。

5 个答案:

答案 0 :(得分:2)

由于您无法对只读模式下打开的常规文件执行任何操作会导致fclose出错,因此您很可能在代码中没有显示错误正在踩踏myFile结构。

此外,测试myFile != EOF将永远不会成为现实,因为您将其设置为fopen的返回值,这将永远不会给您EOF并且您已经为NULL检查了它是不是意味着像:

while((c = fgetc(myFile)) != EOF) {
    // do stuff
}

答案 1 :(得分:2)

此:

while(myFile != EOF)

实际上是非法的(违反约束)。任何符合要求的C编译器都需要发出诊断信息;默认情况下,gcc仅发出警告(有资格作为“诊断”)。

如果gcc给你一个警告,你应该注意它; gcc经常对恕我直言应该被视为致命错误的事情发出警告。如果它没有给你一个警告,你可能会用禁用警告的选项调用它(这很奇怪,因为它默认会产生这个警告)。一组好的选项可以使用-Wall -Wextra -std=c99 -pedantic(或根据需要调整-std=...选项以强制执行不同版本的标准。)

myFile是指针类型,特别是FILE*EOF的类型为int,通常会扩展为(-1)。您无法合法地将指针值与整数值进行比较(除了空指针常量的特殊情况,但这里不适用。)

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

可以将其更改为

while (!feof(myFile))

但这可能会导致其他问题。在从文件读取时检测文件结尾的正确方法是使用您正在使用的任何函数返回的值来读取数据。查阅您正在使用的函数的文档,以查看它在遇到文件结束或错误情况时返回的内容。 {<1}}函数可用于确定之后读完,是否遇到文件结束或错误情况。

答案 2 :(得分:1)

errno说的是什么?将其添加到您的代码中:

#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);
}

希望得到这个帮助。

问候。

答案 3 :(得分:0)

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

如果这部分没问题,那么

fclose(myFile);

肯定会返回你的EOF。因为while循环只终止myFile == EOF(这是一个错误的比较,不要忽略警告)。指针和int之间的比较。因为EOF是stdio.h文件中定义的宏而且根据glibc它-1.Your循环终止,这意味着你的myFile指针改为EOF某些whire。这是你的错误。

只需浏览你的代码就必须更改你不应该覆盖的FILE指针myFile因为它指向一个文件结构 用于所有文件操作。

注意 myFile是一个指向文件的指针,不应该在任何赋值语句中用作左值。

答案 4 :(得分:0)

while(myFile != EOF){...}更改while(!feof(myFile)){...}
myFile是指向FILE结构(内存地址)的指针。不是“文件结束”指标。