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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Ao�t 2010
    Messages
    3
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2010
    Messages : 3
    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 �m�rite

    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
    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
    Candidat au Club
    Inscrit en
    Ao�t 2010
    Messages
    3
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2010
    Messages : 3
    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 �m�rite

    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
    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
    Candidat au Club
    Inscrit en
    Ao�t 2010
    Messages
    3
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2010
    Messages : 3
    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, 07h32
  2. b�te conversion de string en double
    Par lucky dans le forum MFC
    R�ponses: 10
    Dernier message: 12/02/2014, 08h01
  3. R�ponses: 23
    Dernier message: 09/09/2010, 13h11
  4. conversion string en double
    Par kakrocq dans le forum C++/CLI
    R�ponses: 4
    Dernier message: 11/04/2007, 13h54
  5. conversion string en double
    Par zmatz dans le forum SL & STL
    R�ponses: 2
    Dernier message: 14/10/2005, 22h46

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