C语言读取CSV文件时while循环无法遍历全部数据行问题
问题原因
代码无法读取完整6行数据的核心问题有3个:
- 数据类型完全不匹配:test1.csv中存储的都是带小数的浮点数(如-3.000、0.9这类值),但定义的存储数组
A是int整型,fscanf使用的%d格式符仅能读取整数,从第一行开始读取就会因匹配失败直接跳出循环,根本读不到有效数据。 - 缺少文件打开校验:如果文件路径输入错误、权限不足导致
fopen执行失败,fp会是空指针,后续直接操作会触发程序崩溃。 - 缺少文件资源释放逻辑,读取完成后没有关闭文件句柄,会造成资源泄漏。
修正方案
按以下规则修改代码即可正常读取全部6行数据:
- 将存储CSV数据的二维数组
A的类型从int A[50][2]改为double A[50][2],适配浮点型数据存储 - 将
fscanf的读取格式符从%d改为%lf,匹配双精度浮点数的读取规则 - 增加
fopen返回值的空判断,打开失败时直接输出提示并退出程序 - 读取完成后调用
fclose(fp)关闭文件句柄 - 补全main函数的标准返回值
修正后可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main () { // 变量声明 FILE *fp; int c=0; double poly; char file[100]; double A[50][2]; // 改为double类型存储浮点数据 // 输入多项式阶数 printf("Please input a polynomial order (1-4): "); scanf("%lf",&poly); // 输入要打开的文件名 printf("Please enter the name of the data file to open: "); scanf("%s",file); printf("\n"); fp = fopen(file,"r"); // 增加文件打开失败校验 if (fp == NULL) { printf("Failed to open file %s\n", file); return 1; } // 逐行扫描存储文件内容,格式符改为%lf匹配浮点数 while (fscanf(fp, "%lf,%lf,",&A[c][0],&A[c][1])==2) { c++; printf("reading line %d\n",c); } printf("Total data points (x,y) read from file: %d\n",c); // 关闭文件 fclose(fp); return 0; }
测试效果
用提供的test1.csv运行修正后的代码,会依次输出reading line 1到reading line 6,最后统计的有效数据点总数为6,和预期结果完全一致。
内容的提问来源于stack exchange,提问作者Kjan
相关产品推荐
相关产品推荐

