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

C语言文件读取问题:文件不存在时'Read error'重复打印排查

解决C语言中文件不存在时错误信息重复打印的问题

看起来你碰到了一个挺典型的小问题——目标文件不存在时,Read error居然被打印了两次。先把你的代码片段贴出来方便分析:

int loadFlights(char flightDatabase[50], int totalflights, flight_t f[MAX_NUM_FLIGHTS]) {
    int counter;
    FILE *fp;
    fp = fopen("database.txt", "r");
    if(fp == NULL) {
        // 问题出在这里:这条打印被执行了两次
        printf("Read error\n");
        return 1;
    }
    fscanf(fp, "%d", &totalflights);
    if (totalflights > 5) {
        totalflights = 5;
    }
    // 后续for循环代码省略
}

最可能的几个原因及解决办法

我碰到过好几次这种情况,大概率是下面其中一个原因:

  • loadFlights函数被调用了两次
    先去检查你的主函数或者其他调用这个函数的地方,是不是不小心写了两次loadFlights(...),或者在某个循环里重复触发了调用。比如主函数里如果有这样的代码:

    loadFlights(db, num, flights);
    // 中间没做判断,又调用了一次
    loadFlights(db, num, flights);
    

    那每次文件不存在都会触发一次打印,自然就出现两次了。解决办法就是排查调用逻辑,确保只调用一次。

  • 调用处也重复打印了错误信息
    很多人会在调用函数后,又判断返回值再打印一次错误,比如:

    int ret = loadFlights(db, num, flights);
    if (ret != 0) {
        printf("Read error\n"); // 这里又打印了一次!
    }
    

    这种情况的话,要么去掉loadFlights内部的打印,统一在调用处处理错误输出;要么去掉调用处的打印,只保留函数内部的。建议统一逻辑,避免重复输出。

  • 额外小建议:用perror替代单纯的printf
    其实你可以把错误打印改成perror("Read error"),这样不仅会输出你自定义的提示,还会附带系统给出的具体错误原因(比如文件不存在会显示No such file or directory),既能确认错误触发的原因,也方便排查是不是真的每次都是同一个条件触发的打印:

    if(fp == NULL) {
        perror("Read error");
        return 1;
    }
    

内容的提问来源于stack exchange,提问作者Angus Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:04:32