2010-12-08 42 views
2

Je rencontre des problèmes lorsque j'essaie de lire un nombre flottant à partir d'un fichier. Je dois lire 3 numéros de flotteur donnés en ligne comme celui-ci:
v -30,50889491515995 -31,95820181187489 0
(je fais un analyseur à partir d'un fichier .obj de Rhinocéros)Comment lire le nombre flottant avec plus de chiffres en C++?

Voici mon code (avant cette Je lis une chaîne pour voir si c'est un 'v'):

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

nom est une chaîne lue auparavant à partir de l'entrée standard.
P est un struct:

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

Le problème est que les données readed est:
-30,5089 -31,9582 0
au lieu de
-30,50889491515995 -31,95820181187489 0
Il arrondit à 4 décimales, et Je ne veux pas ça!

J'ai essayé de lire avec fscanf mais je ne peux pas lui envoyer un objet fstream. Quelque chose comme ceci:

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

J'ai essayé aussi, mais cela n'a pas fonctionné:

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

Toute idée de la façon d'éviter cela? J'ai besoin de plus de précision dans les coordonnées du vertex!

Merci beaucoup.

+0

Peut-être que vous devriez expliquer pourquoi n'a pas fonctionné dans le deuxième cas –

+0

Il a lu la même chose! (tours à 4 décimales) – fern17

+0

Comment déterminez-vous la précision des variables? –

Répondre

0

setprecision devrait faire ce que vous voulez faire. Vous avez dit que cela n'a pas fonctionné. Qu'en avez-vous retiré? Avez-vous essayé de l'exécuter dans un débogueur? Est-il possible que ce n'est pas entré correctement?

+0

Non, je fais un cout et il lit tout ok (sauf pour l'arrondi). – fern17

+0

Alors arrondit-il lorsque vous utilisez cout? Même si vous utilisez 'setprecision'? – Tristan

+0

Le problème était lorsque j'ai essayé de sortir les données (sur la console ou dans un fichier), j'ai oublié de mettre setprecision dans l'écriture. Je vous remercie. – fern17

4

C++ entrées toujours les chiffres avec une précision complète, mais vous devez spécifier la précision pour l'affichage (ie lors de la sortie des valeurs):

#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'; 
} 

sortie:

30.5088939667 -31.9582023621 0.0000000000 
+0

Ça a aidé! Le problème était sur le cout. J'ai lu avec setprecision mais quand j'ai écrit je n'ai pas utilisé setprecision! C'est résolu, merci! – fern17

+0

@ fern17: vous êtes les bienvenus ... –