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

使用fread()函数读取文件时数组未读到数据,如何修复?

问题修复方案

你的代码存在几个关键问题,导致无法正确读取文件内容:

核心错误点

  • fread使用场景错误:fread是用来读取二进制格式数据的,但你的输入文件是文本格式的浮点数(带逗号、换行符),直接用fread无法解析这些文本内容,自然读不到有效数据。
  • 循环逻辑错误:while (!feof(pFile))的写法本身存在问题(feof只有在读取操作失败后才会被置位,会导致多执行一次循环),而且每次调用fread都从daBuf的起始位置写入,会不断覆盖第一个元素,后面的数组元素都是未初始化的垃圾值。
  • 未检查读取结果:没有判断fread的返回值,无法确认读取是否成功。
  • main函数不符合标准:C语言标准中main函数的返回类型必须是int,而非void。

修正后的代码

针对文本格式的输入文件,应该用fscanf来解析浮点数,同时处理文件中的逗号分隔符:

#include <stdio.h>

void func(const char *srcFilePath)
{
    FILE *pFile = fopen(srcFilePath, "r");
    float daBuf[30];
    int count = 0; // 记录读取到的有效数据个数
   
    if (pFile == NULL)
    {
        perror(srcFilePath);
        return; // 文件打开失败直接返回
    } 

    // 循环读取文本格式的浮点数,跳过逗号
    while (count < 30 && fscanf(pFile, "%f,", &daBuf[count]) == 1)
    {
        count++;
    }

    fclose(pFile); // 记得关闭文件,避免资源泄漏

    // 输出读取到的有效数据
    for (int i = 0; i < count; i++) {
        printf("daBuf[%d] = %f\n", i, daBuf[i]);
    }
}

int main() { // 符合C标准的main函数写法
    const char inputfile[] = "/home/debian/progdir/input";
    func(inputfile);
    return 0;
}

代码说明

  1. 用fscanf解析文本:%f,格式符会读取一个浮点数,然后跳过后面的逗号,完美匹配你输入文件的格式。
  2. 正确的循环条件:循环同时限制数组容量(避免越界)和读取成功的次数,当读取失败或数组满时停止。
  3. 记录有效数据量:用count变量记录实际读取到的浮点数个数,输出时只遍历有效数据,避免输出未初始化的垃圾值。
  4. 关闭文件:文件使用完毕后必须调用fclose关闭,防止资源泄漏。
  5. 标准main函数:改为int main()并返回0,符合C语言标准规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:37:30