Как прочитать число с плавающей запятой с большим количеством цифр в C ++? - PullRequest
2 голосов
/ 08 декабря 2010

У меня возникают проблемы при попытке прочитать число с плавающей точкой из файла. Мне нужно прочитать 3 числа с плавающей точкой, приведенные в следующей строке:
v -30.50889491515995 -31.95820181187489 0
(Я делаю парсер из файла .obj с Rhinoceros)

Вот мой код (перед этим я читаю строку, чтобы увидеть, является ли '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 ]

4 голосов
/ 08 декабря 2010

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
0 голосов
/ 08 декабря 2010

setprecision должен делать то, что вы хотите сделать.Вы сказали, что это не сработало - что вы получили из этого?

Вы пробовали запустить его в отладчике?Возможно ли, что он вводится неправильно?

...