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 :

stringstream utilisé plusieurs fois de suite


Sujet :

SL & STL C++

  1. #1
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut stringstream utilisé plusieurs fois de suite
    Bonjour,

    Est ce quelqu'un sait pourquoi lorsque j'utilise un stringstream pour convertir un string en double (ou int), ca marche bien la première fois, mais ensuite ca foire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    string strX = "262";
    string strY = "285";
    double x, y;
     
    ss << strX;
    ss >> x;
     
    ss << strY;
    ss >> y;
     
    cout << x << endl;
    cout << y << endl;
    affiche :

    La lecture n'est pas destructrice du contenu ? Il faut appeler clear() ou qqchose dans le genre à chaque fois ?

    Apparement oui. Ce monologue m'aura été très utile

  2. #2
    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
    Attention, clear ne fait que remettre à zéro les flags d'erreur du flux (qui sont mis car à chaque extraction tu en atteint la fin). Pour vider le flux, c'est ss.str("").

    Moi je ferais plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ss.str(strX);
    ss >> x;
     
    ss.str(strY);
    ss >> y;
    Par contre je ne sais pas si l'appel à str() replace aussi le curseur de lecture au début.

  3. #3
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    ok, mais ca marche pas quand le fais comme ca, tandis que quand je fais clear ca marche

  4. #4
    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
    Ok, donc l'appel à str() ne replace pas le curseur de lecteur au début.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Dans ce cas il suffit juste de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ss << strX;
    ss >> x;
     
    ss.str("");
     
    ss << strY;
    ss >> y;
    je pense.

  6. #6
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    mmmm
    moi je pense que ca marche pas
    j'avais essayé un truc dans le genre.
    pour l'instant clear() suffit pour ce que je fais

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Tu as essayé ?
    Il me semble que ça marche, mais sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // ton code qui est avant
    // puis :
    {
    stringstream ss;
    ss << strX;
    ss >> x;
    }
    {
    stringstream ss;
    ss << strY;
    ss >> x;
    }
    Tu peux même définir une macro/fonction inline pour que ce soit plus court... Du genre READ_FROM_SSTREAM(strY, y) ...

  8. #8
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    ben en fait j'avais essayé ss.str() avec le string suivante et ca marche pas.
    après y'a la solution de recreer un stringstream à chaque fois comme tu dis...

    j'ai finalement opté pour ca, j'appelle une fonction

    int convert(string&)

    qui declare le stringstream (il est donc détruit à chaque fin d'appel)

    moi je dis quand meme que ca craint que ce soit aussi compliqué de faire des trucs aussi simple

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Il ne faut pas faire ss.str() mais ss.str("") (très important!).

  10. #10
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    Citation Envoyé par mamelouk
    ben en fait j'avais essayé ss.str() avec le string suivante
    ss.str(strY) évidement

    ss.str() ne compile pas...

  11. #11
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Non mais je veux dire il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ss << strX;
    ss >> x;
    
    ss.str("");
    ss << strY;
    ss >> y;
    Il faut bien des "" et non pas strY ou quoi que ce soit d'autre!

  12. #12
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    bon, pour te faire plaisir j'ai essayé :

    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
    #include <sstream>
    #include <iostream>
     
    using namespace std;
     
    int main(void) {
        string strX("240"), strY("300");
        stringstream ss;
        int x, y;
     
        ss << strX;
        ss >> x;
        cout << x << endl;
     
        ss.str("");
        ss << strY;
        ss >> y;
        cout << y << endl;
    }
    j'ai remplacé str("") par clear() et ca marche

  13. #13
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Il me semblait que ss.str("") aurait fait le nécessaire ...
    Quoiqu'il en soit, le problème a été résolu

  14. #14
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    merci de ton aide

  15. #15
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ceci dit, il y a facilement moyen de travailler autrement...

    Pour l'exemple donné, je verrais bien deux solutions:

    La première (et celle qui trouve plus grâce à mes yeux) et de placer toutes les valeurs dans le stringstream avant de commencer à le récupérer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    string str1="256";
    string str2="300";
     
    stringstream ss;
    ss<<str1<<" "<<str2;
    int a;
    int b;
    ss>>a>>b;
    cout<<a<<endl;
    cout<<b<<endl;
    La deuxième solution est, tout simplement, de travailler sur des stringstream qui sont dans des portées différentes
    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
     
    void fonct()
    {
        string str1="256";
        string str2="300";
        int a;
        int b;
        {
            stringstream ss;
            ss<<str1;
            ss>>a;
        }
        /* comme on quitte la portée dans laquelle est déclaré ss, on peut 
         * le redéclarer et il sera remis à 0
         */
        {
            stringstream ss;
            ss<<str2;
            ss>>b;
        }
        cout<<a<<endl<<b<<endl;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Encore plus simple, boost::lexical_cast<int>(maChaine)

  17. #17
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    ah oui c'est vrai j'avais oublié la boost

  18. #18
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Miles
    Encore plus simple, boost::lexical_cast<int>(maChaine)
    La question étant: est-ce réellement plus simple

    Entre une dépendance, un espace de nomage et une instruction supplémentaire pour en arriver, en définitive au même résultat...

    Je n'émet pas d'avis sur le sujet, mais je me pose réellement la question (dans ce cas bien précis du moins)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #19
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    Citation Envoyé par koala01
    La question étant: est-ce réellement plus simple

    Entre une dépendance, un espace de nomage et une instruction supplémentaire pour en arriver, en définitive au même résultat...

    Je n'émet pas d'avis sur le sujet, mais je me pose réellement la question (dans ce cas bien précis du moins)
    seulement une dépendance et une instruction, car ici l'espace de nommage n'est pas déclaré mais directement utilisé. On gagne plusieurs lignes de code, on gagne en lisibilité, et à mon avis on gagne surement aussi en performances

  20. #20
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par mamelouk
    et à mon avis on gagne surement aussi en performances
    En fait pas trop parce que lexical_cast utilise les stringstream.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/01/2015, 12h43
  2. Réponses: 2
    Dernier message: 17/10/2013, 18h27
  3. Socket: Utilisation d'un port plusieurs fois de suite
    Par MrEddy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 29/10/2012, 20h51
  4. Réponses: 3
    Dernier message: 21/06/2010, 22h17
  5. [ADOQuery] Parametre utilisé plusieurs fois
    Par gibet_b dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/09/2004, 10h57

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