gpt4 book ai didi

c - C 中的 fscanf - 逗号、换行符和 %*c

转载 作者:行者123 更新时间:2023-11-30 19:07:23 26 4
gpt4 key购买 nike

我正在尝试使用 fscanf() 读取一个由逗号和换行符分隔的 double 列表组成的文件。该文件看起来像这样

    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

每行将具有与其他行相同数量的 double ,但文件将具有随机数量的行

我现在用来扫描文件的是

    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。有办法解决这个问题吗?

最佳答案

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)

关于c - C 中的 fscanf - 逗号、换行符和 %*c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46896151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com