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

C语言fscanf返回值被忽略报错 文件读取结果错误修复方法

问题产生原因

编译器提示return value ignored 'fscanf'的本质是:fscanf函数的返回值为本次调用成功匹配并完成赋值的字段数量,如果读取到文件末尾、遇到格式不匹配的内容、文件IO错误,返回值会小于格式串里指定的字段数,甚至返回EOF(值为-1)表示读取彻底失败。
你当前的代码直接调用fscanf却未接收、校验这个返回值,一旦读取环节出问题,传入的指针指向的变量不会被正确赋值,局部变量默认存储的是栈上的随机垃圾值,程序后续拿着这些无效值计算,自然会出现结果错误。
另外你贴的代码存在参数不匹配的隐藏bug:你声明了double E;但格式串写了8个%lf占位符,对应传入了8个double类型指针,要么是漏传了&E参数,要么是多声明了无用变量,占位符和传入参数数量/类型不匹配本身就属于C语言未定义行为,也会直接导致读取结果异常。

修复方案
  • 首先核对格式串占位符和传入参数的匹配关系:如果确实需要读取包含E在内的9个双精度浮点数,就把&E补到fscanf的参数列表末尾;如果不需要读取E,就删掉多余的变量声明,保证占位符数量、类型和传入参数一一对应。
  • 必须接收fscanf的返回值做合法性校验,读取失败时直接抛出错误终止流程,避免程序带着无效数据继续运行。参考修复代码如下:
#include <stdlib.h> // 用到exit、EXIT_FAILURE需要引入该头文件
double E;
for (int i = 0; i < 3; i++)
{
    // 接收返回值,此处按读取9个值(含E)为例,不需要读E就把占位符和参数对应删掉
    int res = fscanf(inp_file, "%lf%lf%lf%lf%lf%lf%lf%lf%lf", 
        &inp[i].T, &inp[i].delt, &inp[i].Tk0, &inp[i].m0,
        &inp[i].n, &inp[i].R0, &inp[i].h, &inp[i].delF, &E);
    // 校验读取结果是否符合预期
    if (res != 9) {
        fprintf(stderr, "第%d组输入数据读取失败,预期读取9个数值,实际成功读取%d个,请检查输入文件格式\n", i+1, res);
        fclose(inp_file);
        exit(EXIT_FAILURE);
    }
    // 校验通过后再执行后续计算逻辑
}
  • 如果你只是想临时消除编译器提示(不推荐,会彻底丢失错误检查能力),可以把fscanf的返回值强转为void,明确告诉编译器你故意忽略返回值:
    (void)fscanf(inp_file, "%lf%lf%lf%lf%lf%lf%lf%lf", &inp[i].T, &inp[i].delt, &inp[i].Tk0, &inp[i].m0, &inp[i].n, &inp[i].R0, &inp[i].h, &inp[i].delF);

内容的提问来源于stack exchange,提问作者Ja6лф1337

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:01:33