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

SL & STL C++ Discussion :

utilisation d'un istringstream


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut utilisation d'un istringstream
    Bonjour.

    Je ne comprends pas très bien le concept de l'istringstream.
    En effet, je cherche a faire un petit programme qui convertit une chaine de caractère en un entier, et une chaine de caractère en un réel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //variables:
    string entierString("2");
    int entier;
    string reelString("3.2");
    float reel;
    istringstream iss;
     
    //converison chaine->entier:
    iss.str(  entierString.c_str()  );
    iss >> entier;
     
    //conversion chaine->reel:
    iss.str(  reelString.c_str()  );
    iss >> reel;
    ça marche pour l'entier, mais pas pour le réel. PAR CONTRE, si je mets le conversion chaine->réel d'abord, et chaine->entier ensuite, alors ça marche pour le réel mais pas pour l'entier

    J'en arrive à deux conclusions:
    1) Je ne peux pas faire deux iss.str(...) à la suite
    2) Je pige rien à la notion de istringstream

    Si une âme charitable voudrait bien éclairer ma lanterne, je lui en serait éternellement reconnaissant (et même les générations futures)
    (Le but est d'utiliser un istringstream et non les fonctions strto...)

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    normalement si mais il faut vider le buffer je crois en fesant iss.str( "" );

    heu c'est pas sur mais il me semble

  3. #3
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    l'idée du istringstream (i pour 'in') c'est de charger des données en une fois pour en extraire un flux.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    istringstream iss;
    iss.str("2 3.2");
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    iss >> entier;
    iss >> reel;
    ou :

    Si tu veux recharger des données sur le meme stream il vaut mieux le reinitialiser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    istringstream iss;
     
    iss.str("2"); 
    iss >> entier;
     
    iss.clear();
     
    iss.str("3.2");
    iss >> reel;
    Et à l'inverse, le ostringstream (o pour 'out') c'est de charger un flux de données pour ensuite l'extraire en une fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ostringstream oss;
    oss << "toto" << 2 << 1.5;
    oss << "blabla";
    ...
    cout << oss.str() << endl; // affichage

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Merci pour ces explications très complètes!

    Maintenant ça marche, j'utilise le
    et je comprends mieux l'utilisation du istringstream.

    Par contre, BainE, j'ai essayé ta méthode et je confirme qu'elle ne marche pas.

  5. #5
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    désolé, il me semblait qu'il fallait vider le stream mais il me semblait que clear était un faux ami et ne servait pas du tout a ca

    Autant pour moi

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    clear ne sert effectivement pas à ça (il réinitialise les états internes du flux, notamment ici la fin de flux qui a été atteinte et ne permet donc plus de lecture ultérieure).

    Et pour l'histoire de réinitialiser le contenu avec iss.str(""), c'est exactement ce qu'a fait notre ami sauf qu'il spécifie directement la nouvelle chaîne au lieu d'une chaîne vide...

  7. #7
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Je ne suis pas sur de bien comprendre...

    Cela veut dire qu'il faut faire un "clear" et une réinitilaisation "str", afin de pouvoir: ET mettre une autre chaine dans le stream, ET autoriser la lecture de cette autre chaine, en reinitialisant un état (une sorte de "fin_lecture_atteinte=false en quelque sorte?)

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Biosox
    Je ne suis pas sur de bien comprendre...

    Cela veut dire qu'il faut faire un "clear" et une réinitilaisation "str", afin de pouvoir: ET mettre une autre chaine dans le stream, ET autoriser la lecture de cette autre chaine, en reinitialisant un état (une sorte de "fin_lecture_atteinte=false en quelque sorte?)
    Exactement. Lorsqu'il arrive à la fin, ou lors d'une erreur, ou n'importe quoi d'autre, le flux se met dans un état invalide (via des bits internes prévus à cet effet, que tu peux tester via divers fonctions membres des flux), et ne peux donc plus être utilisé à moins que tu ne remettes ces bits à zéro avec clear().

    str() quant à lui est bien utilisé pour réinitialiser le contenu du flux.

  9. #9
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Eh bien merci beaucoup pour ces précisions.

    Je pense que je peux remettre la balise "résolu" cette fois.

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

Discussions similaires

  1. Utilisation de istrstream ou istringstream
    Par Kazuko dans le forum C++
    Réponses: 2
    Dernier message: 13/12/2011, 00h58
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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