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 :

Soucis avec getLine


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut Soucis avec getLine
    Bonjour à tous. Je suis en train de me coder un simili parseur histoire de pratiquer un peu la navigation dans les fichiers.
    Je bloque sur cette méthode, qui est une des premières que j'ai implantée.

    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
     47 bool Parseur::allerSousPartie(string nomSP, int nb)
     48 {
     49     //Placer le curseur au tout début du fichier
     50     fichier.seekg(0, ios::beg);
     51     string tmp;
     52     //Parcourir les lignes jusqu'à trouver '"begin" + nomSP' nb fois
     53     int cpt=0;
     54     bool dansSP = false;
     55     bool continuer = true;
     56     cout << "test2" << endl;
     57     while (continuer);
     58     {   
     59         cout << "test2" << endl;
     60         getline(fichier, tmp);
     61         cout << tmp << endl; 
     62         if (tmp == ("begin " + nomSP) && dansSP == false)
     63         {   
     64             cout << "trouvé!" << endl;
     65             cpt++;
     66             if (cpt == nb)
     67             {   
     68                 ligneDebut.push_back(fichier.tellg());
     69                 dansSP = true;
     70             }
     71         }
     72         if (tmp == ("end " + nomSP) && dansSP == true)
     73         {   
     74             ligneFin.push_back(fichier.tellg());
     75             compteurSP++;
     76             return true;
     77         }
     78         tmp.clear();
     79         if (fichier.eof())
     80             continuer = false;
     81     }   
     82     return false;
     83 }
    Le soucis arrive à la ligne 60. A l'execution du programme, j'ai la chaine "test1" qui s'affiche, mais "test2" ne s'affiche pas. Je pense que ça viens d'une mauvaise utilisation de getline(), mais je n'arrive pas à voir ce qui ne va pas.
    Pouvez-vous m'indiquer le soucis?

    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Citation Envoyé par NLS le pingouin Voir le message
    Pouvez-vous m'indiquer le soucis
    Tu as un point-virgule en trop à la fin de la ligne 57, ce qui a comme effet une boucle infinie.

    MAT.

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    D'ailleurs pour rebondir sur la correction de Mat, pour un parseur, il serait plus judicieux de ta part de ne pas utiliser un while mais un for avec comme condition d'arrêt le retour de getline
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(string s; getline(fichier,s);)
    {
         // étudier la string en conséquence
    }
    Homer J. Simpson


  4. #4
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par Astraya Voir le message
    pour un parseur, il serait plus judicieux de ta part de ne pas utiliser un while
    Bah, et ça ce n'est pas bon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string str;
    while (std::getline(fichier, s)) {
        // (...)
    }

  5. #5
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Si bien sur! C'est juste une parenthèse de ma part. Dans ton cas la string est valable dans toute la fonction, moi juste dans le for, c'est juste une petite optimisation mémoire, l'instanciation tardive et la string est englobé dans un bloc( le for)
    Homer J. Simpson


  6. #6
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Hé hé, c'était juste histoire de chercher la petite bête…

    Tiens, justement, si on doit en plus analyser chaque ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // is est un std::istream quelconque
     
    for (std::string s; std::getline(is, s); ) {
        std::istringstream iss(s);
        while (getline(iss, s, ';')) {
            // Un certain nombre d'opérations...
        }
    }
    Tu le déclarerais où le std:i)stringstream ?

    Si on le déclare seulement là où on en a besoin, dans la première boucle, il est créé et détruit à chaque itération.
    Par contre, si on veut éviter ça, il faut le déclarer avant, et le réinitialiser à chaque itération ; et puis sa durée de vie excède ce qui est nécessaire.

    Question subsidiaire :
    Pour l'exemple j'ai réutilisé la variable qui sert à lire les lignes.
    Mais si on a besoin d'autres variables, avec des types différents (ou plusieurs std::string), où est-il le plus judicieux de les déclarer ?

  7. #7
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Tu le déclarerais où le std:i)stringstream ?
    Tu encapsules les variables nécessaires
    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
     
    struct MesVariables
    {
        MesVariables()
            :s(),os(),i(){}
     
        std::string s;
        std::ostringstream os;
        int i;
    };
     
    for( MesVariables s; s.i<10; ++s.i)
    {
          //s.variable
    }
    Ou tu utilises for_each et foncteur
    Homer J. Simpson


  8. #8
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Hum…
    On peut définir un struct dans le corps d'une fonction ?

  9. #9
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bien sur, elle sera uniquement valide dans la fonction.
    Tu peux déclarer une classe dans une classe, dans une fonction donc dans le main compris!
    D'ailleurs c'est quelque chose que je fais souvent, déclarer le foncteur + utiliser le for_each dans la même fonction.
    Homer J. Simpson


  10. #10
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Ahhh… je vois…
    Marchi beaucoup !

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il ne faut pas oublier non plus que, bien que ce ne soit pas forcément recommandé, les différentes parties de la boucle for permettent de travailler sur plusieurs choses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int x=10,y=0; i>0,i<10;--x,++y)
    est, par exemple, tout à fait légal
    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

  12. #12
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Oui, ça je m'en ser(vai)s souvent.
    Le seul souci, c'est que dans la première partie du for, on ne peut que déclarer que des objets du même type.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ce ne serait pas plutot un && a la place de la virgule(en fait je ne vois pas trop son interêt) ?

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Joe Dralliam Voir le message
    Ce ne serait pas plutot un && a la place de la virgule(en fait je ne vois pas trop son interêt) ?
    En fait, je voulais surout écrire i>0, j<10...

    j'étais quelque peu distrait
    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

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 17h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

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