IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Conversion de string en double


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Conversion de string en double
    Bonjour,

    Je cherche à lire un csv contenant des valeurs numériques.
    Je convertis les nombres de string à double avec un istringstream.

    Dans l'exemple minimal ci-dessous, la première valeur de mon csv est bien convertie, mais les suivantes gardent la première valeur.

    Je ne vois vraiment pas pourquoi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <iterator>
    #include <boost/tokenizer.hpp>
    #include <sstream>
     
     
    int main()
    {
    	using namespace std;
    	using namespace boost;
     
    	string data("chemin/Data.csv");
     
    /*
    Le fichier data contient simplement:
    0.1,0.2
    0.3,0.4
    */
     
    	ifstream in(data.c_str());
    	if (!in.is_open()) return 1;
     
    	double d;
    	string texte;
    	istringstream stm;
     
    	typedef tokenizer< escaped_list_separator<char> > Tokenizer;
    	vector< string > vec;
    	vector< string >::iterator it;
    	string line;
     
    	while (getline(in,line))
    	{
    		Tokenizer tok(line);
    		vec.assign(tok.begin(),tok.end());
    		it=vec.begin();
     
    		// Pour chaque élément de la ligne du csv:
    		for (it=vec.begin(); it!=vec.end(); ++it)
    		{
    			cout << *it << endl; // Là, le texte s'affiche bien (on voit la bonne valeur)
     
    			texte=*it;
     
    			stm.str(texte);
    			stm >> d;
     
    			cout << d << endl; // Là, le texte est toujours "0.1" (la première valeur du csv)!
     
    		}
    	}
    }
    Quelqu'un aurait-il une idée?

    Merci!

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Ligne 49 tu modifies le std::string détenu par stm, mais stm lui-même n'en est pas informé. Du coup, ses flags sont restés dans le même état qu'à la fin de l'itération précédente, en particulier eof. Comme il considère ne plus rien avoir à lire, stm >> d n'est pas évalué.

    Solutions : Utiliser un std::stringstream et remplir stm avec avec operator<< , ou bien déclarer stm au début de la boucle for.
    [edit] Ou même std::stod, si tu gères C++11.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup.

    Déclarer stm en début de boucle for fonctionne bien.

    Par contre, remplacer le type istringstream par stringstream, et la ligne 49 : par : ne fonctionne pas... (c'est toujours la première conversion qui est resortie).

    Est-ce qu'après avoir redéfini un attribut, il y aurait une méthode pour "mettre à jour" les autres attributs de l'objet?

    Je vais me documenter sur std::stod.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Ah effectivement, il faut vider stm entre-temps : stm.str().clear(). Sinon operator<< continue d'injecter des données au cul de ce qui existe déjà, en extrayant toujours vers d la même portion de son buffer.

    Pour stod c'est tout bête : double d = std::stod(texte);. Par contre texte devra contenir un seul nombre.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup !
    C'est très clair.
    Bonne soirée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Conversion de String en Double
    Par JB-Tech dans le forum Windows Forms
    Réponses: 9
    Dernier message: 26/02/2018, 08h32
  2. bête conversion de string en double
    Par lucky dans le forum MFC
    Réponses: 10
    Dernier message: 12/02/2014, 09h01
  3. Réponses: 23
    Dernier message: 09/09/2010, 14h11
  4. conversion string en double
    Par kakrocq dans le forum C++/CLI
    Réponses: 4
    Dernier message: 11/04/2007, 14h54
  5. conversion string en double
    Par zmatz dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/10/2005, 23h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo