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

fscanf无法读取文件内容,请求技术排查与解决

嘿,我帮你找出代码里的几个核心问题,这就是你读取数据失败的原因啦:

1. 指针q越界访问,返回了错误的指针

你初始化q = p后,在循环里每次执行q++,当循环结束时,q已经跑到了动态分配数组末尾的下一个位置(属于超出数组范围的无效内存)。这时候你用q[0]、q[1]、q[2]去访问,属于数组越界访问,是C语言里的未定义行为,打印出来的内容自然是无意义的“空”或者乱码。

更糟的是,你最后返回的是q,调用者拿到的会是一个指向无效内存的野指针,根本没法正确使用数组里的数据。

2. 验证读取结果时用错了指针

要确认数据是否读取成功,你应该用数组的起始指针p来访问元素,而不是已经偏移到末尾的q。比如把打印语句改成:

printf("%f - %f - %f", p[0], p[1], p[2]);
3. 额外的潜在问题排查点
  • 文件路径是否正确:如果你的程序和目标TXT文件不在同一目录,fopen会进入错误分支打印提示;如果路径没问题,那核心问题还是指针偏移。
  • 检查fscanf的返回值:建议每次调用fscanf后判断返回值是否等于预期读取的变量数量,这样能精准排查是否真的读取到了数据。比如第一次读取可以改成:
if (fscanf(f," %d %f",nMoedas,valor) != 2) {
    printf("读取nMoedas和valor失败\n");
    fclose(f);
    exit(1);
}
修正后的完整代码示例

我把指针的问题修复,同时加上了读取失败的校验逻辑:

float * le_dados_ficheiro(char *nomeFich,int *nMoedas, float *valor) {
    FILE *f;
    float *p,*q;
    int i;
    f = fopen(nomeFich,"r");
    if(!f) {
        printf("Erro ao abrir ficheiro %s\n",nomeFich);
        exit(1);
    }
    // 校验nMoedas和valor的读取结果
    if (fscanf(f," %d %f",nMoedas,valor) != 2) {
        printf("Falha ao ler nMoedas e valor\n");
        fclose(f);
        exit(1);
    }
    p = malloc(sizeof(float)*(*nMoedas));
    if(!p) {
        printf("Erro ao reservar memoria ... \n");
        exit(1);
    }
    q = p;
    for(i = 0; i < *nMoedas; i++) {
        // 校验每个浮点数的读取
        if (fscanf(f," %f",q++) != 1) {
            printf("Falha ao ler a moeda %d\n", i);
            free(p); // 释放已分配的内存,避免内存泄漏
            fclose(f);
            exit(1);
        }
    }
    fclose(f);
    // 使用数组起始指针p打印读取到的数据
    printf("%f - %f - %f", p[0], p[1], p[2]);
    // 返回数组的起始地址p,供调用者使用
    return p;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:27