使用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; }
代码说明
- 用fscanf解析文本:
%f,格式符会读取一个浮点数,然后跳过后面的逗号,完美匹配你输入文件的格式。 - 正确的循环条件:循环同时限制数组容量(避免越界)和读取成功的次数,当读取失败或数组满时停止。
- 记录有效数据量:用count变量记录实际读取到的浮点数个数,输出时只遍历有效数据,避免输出未初始化的垃圾值。
- 关闭文件:文件使用完毕后必须调用fclose关闭,防止资源泄漏。
- 标准main函数:改为
int main()并返回0,符合C语言标准规范。
内容的提问来源于stack exchange,提问作者stella
相关产品推荐
相关产品推荐

