C语言如何读取每行逗号分隔、数量未知的浮点型数据文件
问题根因
fscanf(data, "%lf", &num); 只能读取第一个数值的核心原因是:%lf 格式符默认仅自动跳过空白字符(空格、换行、制表符等),目标文件中数值之间用逗号分隔,读完第一个数值后文件指针停在逗号位置,后续 %lf 无法解析逗号,匹配直接失败,因此无法继续读取后续数值。
可行解决方案
方案1:直接修改fscanf格式串(最简单,无需按行区分)
直接在格式串中加入对逗号的匹配跳过逻辑,无需提前知道每行的数值数量,循环读取直到文件结束即可:
double num; // 格式串逻辑:读取1个double,然后跳过后续所有逗号、空格、换行符 while (fscanf(data, "%lf%*[, \n\r]", &num) == 1) { // 此处处理读取到的浮点数num,示例:打印 printf("%.4lf\n", num); }
说明:%*[, \n\r] 表示匹配括号内的任意字符(逗号、空格、换行、回车)并直接丢弃,* 表示不需要将匹配结果存储到变量,完美适配逗号分隔+换行的文件格式。
方案2:逐行读取再拆分(鲁棒性最强,支持统计每行数值数量)
如果需要区分每行的数值(比如要单独统计每行有多少个浮点数),可以先读整行再拆分解析,兼容性更好,不会因为少量格式异常出错:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { FILE *data = fopen("你的文件路径.txt", "r"); if (!data) { perror("文件打开失败"); return 1; } char line[1024]; // 单行最大长度可根据实际情况调整 char *p, *endp; double num; while (fgets(line, sizeof(line), data) != NULL) { p = line; while (1) { num = strtod(p, &endp); if (p == endp) break; // 该行已无有效浮点数 // 此处处理读取到的浮点数num printf("%.4lf\n", num); p = endp; // 跳过逗号、空格等分隔符 while (*p && (*p == ',' || isspace((unsigned char)*p))) { p++; } } } fclose(data); return 0; }
内容的提问来源于stack exchange,提问作者Golden
相关产品推荐
相关产品推荐

