2

我有一个函数可以从文件中读取特定格式的整数。它可以按需要正常工作,但是每当我尝试使用 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。谢谢和我的道歉。

4

5 回答 5

3

这个:

while(myFile != EOF)

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

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

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

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

可以把它改成

while (!feof(myFile))

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

于 2012-08-04T04:57:11.120 回答
2

由于您无法对以只读模式打开的常规文件执行任何操作,这会导致fclose错误输出,因此您很可能在未显示的代码中存在错误,该错误会影响myFile结构。

此外,测试myFile != EOF永远不会是真的,因为你将它设置为 fopen 的返回,它永远不会给你EOF,你已经检查了它NULL你的意思是不是像:

while((c = fgetc(myFile)) != EOF) {
    // do stuff
}
于 2012-08-04T03:57:26.730 回答
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);
}

希望这有帮助。

问候。

于 2012-08-04T03:54:41.333 回答
0
while(myFile != EOF)
 {
 // read and process the file
 // this part works.
 }

如果这部分没问题,那么

fclose(myFile);

绝对返回EOF。因为while循环仅终止myFile == EOF(这是一个错误的比较,不要忽略警告)。指针和int之间的比较。因为EOF是在stdio.h文件中定义的宏并且根据glibc它-1.您的循环终止,这意味着您的 myFile 指针更改为 EOF some whire。这是您的错误。

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

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

于 2012-08-04T04:36:03.560 回答
0

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

于 2012-08-04T04:48:57.403 回答