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 :

sscanf en c++ avec std::string


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    18
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 18
    Par d�faut sscanf en c++ avec std::string
    Bonjour,

    [D�sol� j'aurais du mettre ce message dans le sous-forum STL].

    J'ai une question � propos de istringstream et de l'�quivalent de sscanf en c++

    La cha�ne de caract�re que je cherche � d�coder est du genre :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    "texte1=<valeur1>\r\n
    texte2=<valeur2>\r\n
    texte3=<valeur3>\r\n"
    dans ce cas, comment faire, car :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    std::string dummy;
     
    	if(!(iss >> dummy >> var1 >> dummy >> var2 >> dummy >> var3))
    	{
    //...
    }
    Ne fonctionne pas, je me retrouve avec dummy qui contient toute la ligne.

    Existe-t-il des modificateurs de istringstream qui me permettent de faire �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    sscanf(buff,"texte1=%f\r\ntexte2=%f\r\ntexte3=%d\r\n", ...);
    ?
    Merci.


    PS : il y a une m�thode qui fonctionne c'est d'utiliser des char, mais c'est illisible, et pas joli.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    char dummy;
     
    	if(!(iss >> dummy >> dummy >> dummy >> dummy >>dummy >>dummy >>dummy >> var1 
    >> dummy >>dummy >>dummy >>dummy >>dummy >>dummy >>dummy >> var2 
    >>dummy >>dummy >>dummy >>dummy >>dummy >>dummy >>dummy >>var3))
    	{
    //...
    }

  2. #2
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Soit tu sorts l'artillerie lourde avec Boost, soit tu t'inspire de Comment d�couper une cha�ne en fonction d'un s�parateur ? en utilisant '=' comme s�parateur et en ignorant le premier tag. A la vol�e quelque chose comme �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    std::ifstream ific(/**/);
    std::string ligne;
        while(std::getline(ific,ligne){
           std::istringstream iss(ligne);
           std::string dummy;
           std::getline( iss, dummy, '=' )
           std::string valeur;
           std::getline( iss, valeur, '=' ) )
        }

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    18
    D�tails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 18
    Par d�faut
    Bonjour,

    Merci pour ta r�ponse, cela fonctionne. Mais (car il faut un mais), comme je veux r�cup�rer les donn�es dans diff�rentes variables, je voulais �viter la boucle et de devoir faire un if/else sur "dummy" pour savoir quelle est la variable. Comme je connais l'ordre, j'avais fait �a :
    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
    	std::istringstream ific("texte1=-21.5\r\ntexte2=58.9\r\ntexte3=5588\r\n");
    	std::string ligne;
    	std::getline(ific,ligne);
     
    	       std::istringstream iss(ligne);
    	       std::string dummy;
    	       std::getline( iss, dummy, '=' );
    	       std::string valeur;
    	       std::getline( iss, valeur, '=' ); 
    	       std::cout << "-> dummy = " << dummy << "val = " << valeur << std::endl;
     
     
           	std::getline(ific,ligne);
     
    		iss.str(ligne);
    	     	std::getline( iss, dummy, '=' );
    	        std::getline( iss, valeur, '=' ); 
    	        std::cout << "-> dummy = " << dummy << "val = " << valeur << std::endl;
     
       	std::getline(ific,ligne);
     
    		iss.str(ligne);
    	        std::getline( iss, dummy, '=' );
    	        std::getline( iss, valeur, '=' ); 
    	        std::cout << "-> dummy = " << dummy << "val = " << valeur << std::endl;
    Mais cela ne fonctionne pas, je me retrouve avec :
    -> dummy = texte1val = -21.5
    -> dummy = texte1val = -21.5
    -> dummy = texte1val = -21.5
    Du coup, j'ai red�clar� de nouvelles instances de iss pour que �a marche.
    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
    	std::istringstream ific("texte1=-21.5\r\texte2=58.9\r\ntexte3=5588\r\n");
    	std::string ligne;
    	std::getline(ific,ligne);
     
    	       std::istringstream iss(ligne);
    	       std::string dummy;
    	       std::getline( iss, dummy, '=' );
    	       std::string valeur;
    	       std::getline( iss, valeur, '=' ); 
    	       std::cout << "-> dummy = " << dummy << "val = " << valeur << std::endl;
     
     
           	std::getline(ific,ligne);
     
    		std::istringstream iss2(ligne);
    	     	std::getline( iss2, dummy, '=' );
    	        std::getline( iss2, valeur, '=' ); 
    	        std::cout << "-> dummy = " << dummy << "val = " << valeur << std::endl;
     
       	std::getline(ific,ligne);
     
       		std::istringstream iss3(ligne);
    	        std::getline( iss3, dummy, '=' );
    	        std::getline( iss3, valeur, '=' ); 
    	        std::cout << "-> dummy = " << dummy << "val = " << valeur << std::endl;

    Je sais pas si quelqu'un sait : Quelle est la diff�rence entre le constructeur de l'iss et str("...") ? Pourquoi �a marche pas avec str("..") ?

    Merci.

    PS : �a reste beaucoup plus long qu'un simple sscanf...
    Pour ce qui est de Boost, j'en utilise d�j� dans le programme (threads, filesystem, string_algo), je vais regarder si c'est pas plus simple par regex. Parce que le tokenizer va me donner la m�me "complexit�" de code, je pense.

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Ben, tu mets tout dans un std::vector<std::string> plut�t que d'avoir 40 fois la boucle... c'est comme �a que proc�de tokenizer.

  5. #5
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par lebaste77 Voir le message
    Je sais pas si quelqu'un sait : Quelle est la diff�rence entre le constructeur de l'iss et str("...") ? Pourquoi �a marche pas avec str("..") ?
    A v�rifier, mais je crois que str ne r�initialise pas les flags oef/bad/fail alors qu'avec le constructeur tu pars avec un �tat ok.

Discussions similaires

  1. Probl�me avec std::string
    Par Gobelins dans le forum D�buter
    R�ponses: 8
    Dernier message: 03/01/2011, 08h57
  2. probl�me avec std::string
    Par haraelendil dans le forum Langage
    R�ponses: 10
    Dernier message: 25/06/2010, 18h56
  3. probl�me avec std::string:find()
    Par Spidyy dans le forum SL & STL
    R�ponses: 8
    Dernier message: 03/09/2009, 01h25
  4. formatage avec std::string
    Par hpfx dans le forum SL & STL
    R�ponses: 2
    Dernier message: 21/09/2008, 13h57
  5. Probl�me avec std::string
    Par Laughing Man dans le forum C++
    R�ponses: 18
    Dernier message: 07/02/2008, 19h04

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