我正在尝试使用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。无论如何要解决这个问题吗?
答案 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)