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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    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 Expert

    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
    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 Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    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
    }

  4. #4
    Membre émérite 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 : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    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 Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    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)

  6. #6
    Membre émérite 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 : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    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 ?

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