C语言读取分号分隔CSV文件失败,请求技术帮助
问题描述
我有如下格式的测量数据:
40.0095;34.0;;0.065058;;392;300;;;;;;;;;;; 40.0242;;14.8;;;;;;392;300;400;300;20.0;0.0;0.0;-0.0;0.3;-0.3;1444;1494;392.9;18.6;299.7;-4.4
以此类推。我尝试用fscanf读取该文件,但无法正确读取数值,结果全是0.0。以下是我的代码:
# include <stdio.h> # include <string.h> double t_abs[700] ; double t_nxtSIO[700] ; int main( ) { FILE *filePointer ; filePointer = fopen("BallPlateLogData.txt", "r") ; if ( filePointer == NULL ) { printf( "file failed to open." ) ; } else { int read = 0 ; int line = 0 ; printf("The file is now opened.\n") ; do{ if (line != 0) { read = fscanf(filePointer, "%lf[^;], %lf[^;]\n", t_abs[line], t_nxtSIO[line]) ; } line++ ; if (ferror(filePointer)) { printf("Error reading file\n"); return 1 ; } fclose(filePointer) ; printf("%0.1f\n", t_abs[line]) ; } while (!feof(filePointer)) ; } return 0; }
这段代码无法正常工作,求帮忙!
问题分析与修复
你的代码存在多个关键问题,导致无法正确读取数据:
1. fscanf格式字符串错误
你写的%lf[^;], %lf[^;]\n是错误的格式:
%lf是浮点数格式说明符,不能直接和[^;]扫描集拼接,正确写法应为%lf;%lf——因为你的数据用分号分隔,fscanf会自动匹配分号并读取后续浮点数。- 格式中的逗号是多余的,你的数据分隔符是分号,不是逗号。
2. 未传递变量地址给fscanf
fscanf需要接收变量的指针来存储读取到的值,你直接传入t_abs[line]和t_nxtSIO[line]是值传递,无法将数据写入数组。必须改成&t_abs[line]和&t_nxtSIO[line]。
3. 循环与文件操作逻辑混乱
- 在
do-while循环的第一次迭代中,你直接调用了fclose(filePointer),导致后续循环无法再读取文件(文件已关闭)。文件关闭操作应该放在循环结束后执行。 feof的使用逻辑错误:!feof(filePointer)不能作为循环的判断条件,应该在读取操作完成后检查是否成功读取。- 打印
t_abs[line]时,line已经自增,此时访问的是未赋值的数组元素,自然输出0.0。
4. 冗余头文件
代码中包含了<string.h>但并未使用,可直接删除。
修复后的代码
#include <stdio.h> double t_abs[700]; double t_nxtSIO[700]; int main() { FILE *filePointer = fopen("BallPlateLogData.txt", "r"); if (filePointer == NULL) { printf("file failed to open.\n"); return 1; } printf("The file is now opened.\n"); int line = 0; // 循环读取前两个分号分隔的浮点数,直到读取失败或数组满 while (fscanf(filePointer, "%lf;%lf", &t_abs[line], &t_nxtSIO[line]) == 2) { // 打印已读取的有效值 printf("t_abs[%d]: %.4f\n", line, t_abs[line]); printf("t_nxtSIO[%d]: %.1f\n", line, t_nxtSIO[line]); line++; // 防止数组越界 if (line >= 700) { printf("Array is full, stopping read.\n"); break; } } // 检查读取过程中是否出现错误 if (ferror(filePointer)) { printf("Error reading file\n"); fclose(filePointer); return 1; } fclose(filePointer); return 0; }
额外说明
如果数据行中存在连续分号(如;;)的空字段,上述代码仍能正常读取前两个数值,因为fscanf会自动跳过匹配过程中的空白和无效分隔符。如果需要读取后续字段,可扩展格式字符串,例如%lf;%lf;;%lf来读取第三个非空字段。
内容的提问来源于stack exchange,提问作者kartiks77
相关产品推荐
相关产品推荐

