C语言中文件的feof()函数和EOF有什么区别?

What is the difference between feof() function and EOF of a file in C?

提问人:sunflower 提问时间:3/18/2023 最后编辑:chqrliesunflower 更新时间:3/18/2023 访问量:181

问:

我不明白函数和有什么区别?两者都代表文件的末尾,那么它们有什么不同,我们怎么知道在哪里使用什么?feof()EOF

在哪里使用该功能以及在哪里使用?feof()EOF

C 文件 EOF Feof

评论

3赞 Weather Vane 3/18/2023
否,不代表文件结束。当尝试读取文件末尾时,它会发出通知。相关新闻: 为什么 while ( !feof (file) ) 总是错的?它的主要用途是消除文件读取函数失败时的原因。feof()
0赞 Steve Summit 3/18/2023
EOF是一个值。您可以将事物与此值进行比较。 是一个函数,它返回一个值。您可以调用 ,看看它能给你带来什么价值。feof()feof()
0赞 Steve Summit 3/18/2023
如果调用 ,并且它给你的值等于 ,则已命中文件末尾。(也就是说,没有给你一个真实的角色,因为没有更多可以给的了。或者,如果调用 ,并且它返回一个 true 值,则表示您已命中文件末尾。getcharEOFgetcharfeof(stdin)

答:

0赞 0___________ 3/18/2023 #1

如果上一个文件操作设置了文件结束标志,则函数返回 TRUE。feof(file)

EOF是许多文件 I/O 函数返回的整数常量,表示无法从文件/流中读取更多数据。

在哪里使用 feof() 函数以及在哪里使用?

基本上,您可以在 I/O 操作使用来检查是否设置了文件结束标志(即是否可以从文件/流中读取更多数据)feof(file)

EOF 由许多 I/O 函数返回 - 您需要阅读函数文档。示例 fscanf

评论

0赞 chqrlie 3/18/2023
EOF是一个宏,它扩展为具有负值的类型的整数常量表达式int
0赞 Weather Vane 3/18/2023
getchar()将是一个更好的例子。 最好检查转换正确数量的项目。fscanf()
3赞 chqrlie 3/18/2023 #2

feof并在 中定义。EOF<stdio.h>

EOF是一个宏,它扩展为具有负值(通常)的整数常量表达式。它与 和 返回的所有有效字节值不同。如果无法从流中读取任何字节,则返回这些函数。返回值必须存储到 a 中,以便进行比较,以便可靠地检测文件末尾。int-1getchar()getc()fgetc()EOFintEOF

关于,快速的答案是:feof()

永远不要使用 feof(file),始终检查所有文件读取函数的返回值以检测流的结束:

对于 或 :getchar()getc()fgetc()

int c;
while ((c = getchar()) != EOF) {
    // handle the byte read from the file
}
// end of file reached

为:fgets()

char buf[100];
if (fgets(buf, sizeof buf, file)) {
    // a line was read into buf, or the initial portion of
    // the current line if longer than 99 bytes.
} else {
    // end of file has been reached.
}

为:fread()

size_t nread = fread(buf, size_of_element, count_of_elements, file);
if (nread > 0) {
    // handle the elements read
} else {
    // end of file reached
}

对于和:scanf()fscanf()

int value;
int res = fscanf(file, "%d", &value);
if (res == 1) {
    // int value was read from the stream
} else {
    // no integer could be read: either input is not an integer or
    // end of file was reached.
    // read and discard the input line
    int c = EOF;
    if (res != EOF) {
        while ((c = getc(file)) != EOF && c != '\n')
            continue;
    }
    if (c == EOF) {
        // end of file reached
    } else {
        // try and recover from invalid input.
    }
}

关于 和 : 读取字符串是一个错误,因为任何足够长的输入都会导致缓冲区溢出,并可能被用作漏洞。建议使用 或 将一行读入数组 和 use 中,以仔细解析其内容,指定要存储到 and 转换的目标数组中的最大字符数:scanf()fscanf()%sfgets()getline()charsscanf()%s%[

char line[100];
char player[20];
char eol;
int score;
while (fgets(line, sizeof line, file)) {
    if (sscanf(line, "%19s%d%c", player, &score, &eol) != 3 || eol != '\n') {
        fprintf(stderr, "invalid input: %s\n", line);
        if (!strchr(line, '\n')) {
            int c;
            while ((c = getc(file)) != EOF && c != '\n')
                continue;
            if (c == EOF)
                break;
        }
        continue;
    }
    // handle the player score...
}
// end of file has been reached.

您可能想阅读并理解为什么“while( !feof(file) )”总是错的?.

长答案是:

该函数返回文件结束指示器的值,该指示器可能已由上一个文件读取操作在到达文件末尾时设置。由于应始终测试这些文件读取操作是否成功,因此很少使用此函数,仅用于区分文件读取错误和到达文件末尾。如今,文件读取错误在桌面系统上非常罕见,因此通常不需要这种区分。99% 使用的代码滥用了此函数。feof()feof()

评论

0赞 Gabriel Staples 3/18/2023
所以,这听起来像是各种文件读取函数在内部的某个地方设置了一个标志,只是读取之前设置的标志并返回其值,对吧?因此,文件读取函数可以返回错误值,而我假设只是告诉您是否设置了内部标志。feof()EOFfeof()EOF
1赞 chqrlie 3/18/2023
@GabrielStaples:是的,你的解释是正确的。没有理由使用,只需测试文件读取函数的返回值即可。feof()
0赞 Steve Summit 3/18/2023
有关何时有用的示例,请参阅此答案中的代码。feof
1赞 chqrlie 3/18/2023
@SteveSummit:恐怕这个例子不是一个很好的例子。代码在读取错误时将具有未定义的行为。为什么不使用或检查正确的方法?fread()EOF
1赞 chux - Reinstate Monica 3/18/2023
“文件读取错误在当今的桌面系统上非常罕见” --> 要测试代码是否存在持久性读取错误,只需使用 和 input 函数即可轻松返回读取错误。非持久性读取错误很棘手。FILE *file = fopen("abc.txt", "w");EOF
0赞 chux - Reinstate Monica 3/18/2023 #3

function 和 ... 和有什么不一样?feof()EOF

EOF从各种输入函数返回,以指示:

  1. 在没有其他输入的情况下尝试读取时,刚刚发生读取文件结束情况。这将设置流的文件结束标志。

  2. 设置了流的文件结束标志,并且未发生读取尝试。

  3. 流检测到输入错误,例如尝试从输出流中读取或(很少)某些通信错误。

  4. 其他*1.

feof()报告流的文件结束标志。


在哪里使用该功能以及在哪里使用?feof()EOF

观察 的输入函数的返回值,以检测无输入条件。EOF

用于检测输入函数返回 的原因。feof()EOF

    int ch = fgetc(stream);
    if (ch == EOF) {
      if (feof(stream)) puts("End of file");
      else puts("Input error");
    }

*1 也会在极少数计算机上返回,其中 和 可以指示有效的输入字符。此处省略了此类机器的详细信息。EOFsizeof(int) == 1