如何在C ++中读取带有更多数字的浮点数?

时间:2010-12-08 04:49:32

标签: c++ parsing floating-point rounding

当我尝试从文件中读取一个浮点数时,我遇到了问题。我需要阅读3行浮点数,如下所示:
v -30.50889491515995 -31.95820181187489 0
(我正在从Rhinoceros的.obj文件中做一个解析器)

这是我的代码(在此之前我读了一个字符串,看看是否是'v'):

fstream f(name.c_str());  
...  
f>>p.x>>p.y>>p.z;  

name是从标准输入开始之前的字符串。
P是结构:

typedef struct Point{  
double x;  
double y;  
double z;  
}Point;  

问题是所提出的数据是:
-30.5089 -31.9582 0
而不是 -30.50889491515995 -31.95820181187489 0
它以4位小数舍入,我不希望这样!

我试着用fscanf阅读,但我不能发送一个fstream对象。像这样:

fscanf(f,"%f %f %f",p.x,p.y,p.z);

我也尝试了这个,但它不起作用:

f>>setprecision(10)>>fixed>>p.x>>p.y>>p.z;

如何避免这种想法?我需要更高精度的顶点坐标!

非常感谢。

2 个答案:

答案 0 :(得分:4)

C ++始终以完全精度输入数字,但您需要指定显示精度(即输出值时):

#include <iostream>
#include <iomanip>
#include <sstream>

int main()
{
    std::istringstream iss("30.50889491515995 -31.95820181187489 0");

    float x, y, z;

    if (iss >> x >> y >> z)
        std::cout << std::setprecision(10) << std::fixed
                  << x << ' ' << y << ' ' << z << '\n';
}

输出:

30.5088939667 -31.9582023621 0.0000000000

答案 1 :(得分:0)

setprecision应该做你想做的事。你说它不起作用 - 你从中得到了什么?

您是否尝试在调试器中运行它?是否有可能输入不正确?