You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何区分fscanf返回EOF是文件结束还是读取错误?

区分fscanf返回EOF的两种情况:文件末尾 vs 读取异常

这个问题绝对是C语言文件I/O里的经典坑——fscanf()返回EOF时,背后可能是正常读到文件结尾,也可能是磁盘故障、权限不足这类异常,处理逻辑完全不一样。别慌,用标准库的两个函数就能轻松区分:feof()和ferror()。

核心判断逻辑

当fscanf()返回EOF后,按以下顺序检查:

  • 先调用ferror(stream):如果返回非0值,说明读取过程中发生了异常错误(比如磁盘读写失败、输入流意外中断)。
  • 如果ferror()返回0,再调用feof(stream):返回非0值则表示正常到达文件末尾。

关键函数说明

  • ferror(FILE *stream):专门检测文件流是否发生了读写错误,错误发生时会设置流的错误标志,这个函数就是用来检查这个标志的。
  • feof(FILE *stream):检测文件流是否到达末尾,只有当你尝试读取过文件末尾之后,这个标志才会被置位,它不能用来提前判断“下一次读取会不会到末尾”。

完整代码示例

下面是一个读取文件中整数的例子,完整处理了所有情况:

#include <stdio.h>

int main() {
    FILE *fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    int num;
    while (1) {
        int ret = fscanf(fp, "%d", &num);
        
        if (ret == EOF) {
            // 区分EOF的两种原因
            if (ferror(fp)) {
                fprintf(stderr, "Error reading file!\n");
                perror("Detailed error"); // 打印具体错误信息
            } else if (feof(fp)) {
                printf("Successfully reached end of file.\n");
            }
            break;
        } else if (ret != 1) {
            // 注意:fscanf返回成功匹配的参数个数,这里如果不是1,说明输入格式不匹配(比如读到了非数字字符)
            fprintf(stderr, "Input format mismatch! Skipping invalid content.\n");
            // 清理缓冲区里的无效字符,避免死循环
            int c;
            while ((c = fgetc(fp)) != '\n' && c != EOF);
        } else {
            printf("Read integer: %d\n", num);
        }
    }

    fclose(fp);
    return 0;
}

额外注意点

别忽略fscanf()返回非EOF但匹配失败的情况(比如例子里的ret != 1),这种情况不会返回EOF,但也是读取异常,如果不处理,程序可能会卡在循环里反复尝试读取无效内容。

内容的提问来源于stack exchange,提问作者Mehdi Zayene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:24:10