ansi-c fscanf问题

时间:2010-03-14 07:20:27

标签: c programming-languages file

嗨,我按如下方式阅读文件

       fscanf(fp,"%f %f %f\n",&*(p1+i), &*(p2+i), &*(p3+i));

我的文件行由三个浮点数组成......

我遇到的问题是在文件中假设我有一些浮点数,让我们说点后最多两位数。但是当我要求c使用不同的格式打印这些值时,例如%lf,%。2lf,%。4lf ......它开始播放数字...我唯一关心的是这个,如果我让我们说1343.23在文件中,然后将完全按照计算中的值使用此值,否则它将与点后面的数字一起使用。如果它会播放,那怎么可能使它完全按原样使用浮点数?例如在最后一种情况下,即使我要求它使用%。10lf打印该值,我希望它只能打印1343.2300000000。非常感谢!

3 个答案:

答案 0 :(得分:2)

“问题”是浮点数根据定义是近似值。您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic以获取更多信息。

此外,您可以将&*(x)简化为x,因此您应在p1+i来电中写p2+ip3+ifscanf

答案 1 :(得分:1)

当您读入字符串1343.23时,将其视为十进制数,它将转换为计算机的内部二进制表示形式。使用格式说明符输出从二进制转换为十进制。在输出时,如果在小数点后面要求不同的位数,则可能得不到完全相同的值。特定的浮点十进制数可能无法在有限长度的二进制浮点数中精确表示,因此应该进行舍入。

有关更好的解释,请参阅着名文章 What Every Scientist Should Know About Floating-Point Arithmetic

答案 2 :(得分:0)

点后的位数对fscanf没有任何影响。你应该摆脱& *的东西,并在字符串的末尾添加一个新行:

fscanf(fp, "%f %f %f\n", p1 + i, p2 + i, p3 + i);