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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:11