C中的fscanf - 逗号,新行和%* c

时间:2017-10-23 18:30:31

标签: c scanf

我正在尝试使用fscanf()来读取由逗号和新行分隔的双精度列表组成的文件。该文件看起来像这样

    3.000000,1.000000,1180.000000,1955.000000,221900.000000
    3.000000,2.250000,2570.000000,1951.000000,538000.000000
    2.000000,1.000000,770.000000,1933.000000,180000.000000
    4.000000,3.000000,1960.000000,1965.000000,604000.000000
    3.000000,2.000000,1680.000000,1987.000000,510000.000000

每一行都会有与其他行相同数量的双倍但文件将有一个随机数量的行

我现在用来扫描文件的是

    while((fscanf(train, "%lf %*c", &k)) != EOF)
    {
        printf("%lf ", k);
    }

使用这个我得到

    3.000000 1.000000 1180.000000 1955.000000 221900.000000
    0.000000 2.250000 2570.000000 1951.000000 538000.000000
    0.000000 1.000000 770.000000 1933.000000 180000.000000
    0.000000 3.000000 1960.000000 1965.000000 604000.000000
    0.000000 2.000000 1680.000000 1987.000000 510000.000000

这个问题是每个新行的开头,%* c跳过double的第一部分,并打印0.000000。无论如何要解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

fscanf(train, "%lf %*c", &k)正在读取最后一个数字时,空白字符会吞下换行符,而%*c会吞下下一个数字的第一个数字。因此,fscanf调用的后续应用只会在尝试读取下一行的第一个数字时看到.000000

由于数字和逗号之间实际上没有任何空格,只需在格式字符串中删除它。

while((fscanf(train, "%lf%*c", &k)) != EOF)

fscanf遇到文件末尾时将返回EOF,否则它将返回扫描到参数中的成功元素的数量。因为你传入1,你期望获得1回报。在输入错误时,fscanf报告在您的案例中保存的0个参数。但是,错误数据会保留在输入缓冲区中,因此后续调用将以相同方式失败。因此,EOF检查会导致无限循环。您可以更改代码以检查扫描是否成功。 (chux的评论中注明了这一点。)

while((fscanf(train, "%lf%*c", &k)) == 1)

答案 1 :(得分:0)

使用fgets然后解析该行:

double d;
char *lineBuf = malloc(MAX_LINE + 1); // Or size more appropriately to your needs.

while (fgets(lineBuf, MAX_LINE + 1, inputFile) == lineBuf)
{
    d = atolf(lineBuf); // Stops at first comma or whitespace.
    printf("%lf", d);
}

如果您对多个字段感兴趣,请使用strtok打开字段。