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 à l'essai
    Inscrit en
    Mai 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 18
    Points : 10
    Points
    10
    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
    Points : 13 017
    Points
    13 017
    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 à l'essai
    Inscrit en
    Mai 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 18
    Points : 10
    Points
    10
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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
    Points : 13 017
    Points
    13 017
    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