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 :

problème de lecture depuis un fichier texte


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut problème de lecture depuis un fichier texte
    Bon, dans la série le débutant est parmi vous... nouveau problème... Je fais la boucle ci-dessous :
    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
     
    if(fichier)
    {
    fichier>>nb_q;
    cout<<nb_q<<endl;
    i=0;
    while(i<nb_q) 
    {
    fichier>>type_q;
    cout<<type_q<<endl;
    quiz1.ajout_type(type_q);
    fichier>>nb_items;
    cout<<nb_items <<endl;
    getline( fichier, lecture );
    quiz1.ajout_question(lecture);
    cout<< lecture<<endl;
    lecture.erase();
    j=0;
    while(j<nb_items)
    {
    getline( fichier, lecture );
    cout<< lecture<<endl;
    tempo_rep.push_back(lecture);
    lecture.erase();
    fichier>> val_vera;
    tempo_vera.push_back(val_vera);
    cout<< val_vera<<endl;
    j++;
    }
    Le fichier à lire contient :

    2
    0
    2
    Pourquoi 1 ?
    Pcq 1.1
    1
    Psc 2.2
    0
    1
    2
    Pquoi 2 ?
    Pcq 2.1
    1
    Pcq 2.2
    0
    et mon abruti de programme m'affiche :

    2
    0
    2

    Pourquoi 1 ?
    -1076114632

    -1076114632
    0
    2


    -1076114632

    -1076114632
    Ca part bien, mais... on dirait qu'il lit un saut ed ligne quelque part, ou que fichier "pointe" avec un coup de retard ou d'avance ou je ne sais quoi et que ça décale la lecture du fichier... J'y comprends rien (ça doit être moi l'abruti).

    Si quelqu'un à des idées... mon cerveau bouilloit...

    Marci bacoup,

    Hugo

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Bon je suis pas sûr, mais j'ai jamais vu la fonction "erase" utilisé comme ça sur un string. Et je crois qu'à priori t'as pas besoin d'effacer ta string "lecture", le getline suivant remplacera le contenu directement.

    Fin bref petite suggestion, essaye sans le lecture.erase().

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Déjà essayé et hélas... a marche pas...
    Je vais essayer de recompiler sous win (j'étais sous linux)... qui vivra verra...
    Hugo

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bon,
    ça plante win également, un peu différemment... (j'ai modifié le fichier lu, mais bon) ça donne :

    1
    0
    2

    Pourquoi ?
    -1
    Pourquoi ?
    -1
    Au lieu de :

    1
    0
    2
    Pourquoi ?
    Pcq1
    1
    Pcq2
    0
    Comprends pô... si quelqu'un a des suggestions... je deviens dingue...

    Merci

    Hugo

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Peut-être un espace après le 2 dans ton fichier de texte ? du coup le premier getline récupèrerait la fin de ce qu'il y a après le 2, (d'où la ligne vide), le second getline récupèrerait le "Pourquoi 1 ?", et ensuite tu essayerais de mettre une chaîne de caractère dans un int donnat un résultat qui ne ressemble à rien.

    Suggestion un peu stupide je te l'accorde mais ce genre d'erreurs m'arrive tellement souvent

    Ou alors essayer de faire un getline sur le 2 (au lieu de le récupérer via >>) et afficher le résultat ? Si ca ne donne pas ce que l'on veut c'est peut-être que le flux se trouve juste après la dernière valeur récupérée via >> (donc avant le caractère de nouvelle ligne) et que le getline se contente de ne rien récupérer le premier coup.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Je peux essayer mais c'est pas satisfaisant : ça devrait faire ce qu'on lui dit ces bêtes, pas l'inverse... Je vais voir (mais j'y crois pas).
    Merci de te donner du mal, en tout cas,
    Hugo

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    En effet, marche pas... Il y a vraiment un gag, mais je ne comprends pas où... C'est pourtant pas sorcier (à première vue) bon sang de... (ouais, ça commence sérieusement à me gonfler ce truc...je vais revenir au bon vieux fread(), ça ça marche bien ! )

    Hugo

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Effectivement mais ton code me semble correct donc je ne vois que deux possiblités d'erreur : soit ton fichier texte a un problème, soit l'utilisation de getline après la récupération via >> (que je n'ai jamais utilisé, puor ça que je me dis que ça vaut le coup de vérifier via le getline pour le dernier chiffre :p) se comporte de manière bizarre.

    EDIT : erf, pas d'autres idées alors désolé

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bon, eh bé... a marche pas... je vais retourner à monbon vieux fread et aux formats C... retenez moi ! Enfin bon, je vais chercher un peu plus, mais la doc de getline ne m'a pas appris grand chose...

    si quelqu'un a d'autres idées...,

    Hugo

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'ai repris ton programme, en ajoutant les définitions qui vont bien, et en éliminant les stockages dans des structures non spécifiées, et en faisant quelques modif à droit à gauche. J'obtient je pense un bon résultat.

    LitFichier.cpp

    Quand tu mélanges >> et getline, ne pas oublier de supprimer la fin de ligne entre lmes deux...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Effectivement : ça marche !!!! Merci beaucoup !!!
    Bon, je vais devoir lire un peu en détail pour bien comprendre...

    Hugo

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bonjour,
    Je reviens à la charge parce qu'après mure réflexion il y a deux trois petites choses qui clochent...
    Ci-dessous un petit bout de code qui fait quelque chose de bizarre :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include <iostream>
    #include <string>
    #include <vector>
    #include <fstream>
    #include <sstream>
     
    using namespace std;
     
    #include "essai_class.cpp"
     
    int main(void)
    {
    int i;
    int j;
    int nb_q;
    int type_q;
    int nb_items;
    string val_vera;
    quizz quiz1;
    string lecture;
    vector<string> tempo_rep;
    vector<int> tempo_vera;
     
    ifstream fichier("essai");
     
    if(fichier)
    {
       fichier>>nb_q;  
     
       cout<<nb_q<<endl;  // 1
     
       i=0;
      while(i<nb_q) 
      {
          fichier>>type_q;
    cout<<type_q<<endl;   // 0
          quiz1.ajout_type(type_q);
     
          fichier>>nb_items;
    cout<<"cc"<<nb_items<<"cc" <<endl;  // 2
          fichier.ignore(1, '\n');
          getline( fichier, lecture , '\n' );
          quiz1.ajout_question(lecture);
    cout<<"cc"<< lecture<<"cc"<<endl; //Pourquoi ?  **
          lecture.erase();
          j=0;
          while(j<nb_items)
          {
              getline( fichier, lecture , '\n' );
    cout<< lecture<<endl;
              tempo_rep.push_back(lecture);
    //          lecture.erase();
    //          fichier>> val_vera;
              getline(fichier,val_vera, '\n' );
    //          fichier.ignore(1, '\n');
    //          tempo_vera.push_back(val_vera);
    cout<<"cc"<< val_vera<<"cc"<<endl;
              j++;
           }
           quiz1.ajout_item(tempo_rep);
           tempo_rep.clear();
           quiz1.ajout_vera(tempo_vera);
           tempo_vera.clear();
           i++;
      }
       fichier.close();
       }
    //cout<< quiz1.reponses[1][0];
     
    return 0;
    }

    Le fichier à ouvrir est:

    1
    0
    2
    Pourquoi ?
    Pcq 1
    1
    Pcq 2
    0
    et à l'exécution, ce bout de code affiche :

    1
    0
    cc2cc
    cccc *
    Pourquoi ?
    ccPcq 1cc
    1
    ccPcq 2cc
    En fait, on voit en ligne * de l'affichage (qui correspond à ** dans le code) que "Pourquoi ?" ne s'affiche pas, mais qu'il y a une ligne vide dans la string lecture, ce qui résulte/est dû à un décalage qu eje ne comprends pas dans la lecture du fichier (une ligne pas sautée, ou un saut de ligne pris pour une ligne, je ne sais pas...) et ça décale tout, si bien que le dernier chiffre n'est pas lu - d'une part - et on ne peut lire qu'en déclarant val_vera en string quand ce devrait être un int...j'en perd un peu mon latin (ou mon fortran, comme vous voulez )...

    Hugo

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    J'ai trouvé la réponse en posant la question : il y avait un espace malencontreux dans le fichier source après le 2... qui n'était pas lu par fichier>>int et donc atterrissait dans le getline suivant...

    Hugo

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

Discussions similaires

  1. problème de lecture d'un fichier texte
    Par peppena dans le forum Langage
    Réponses: 5
    Dernier message: 25/05/2007, 15h10
  2. Problème de lecture dans un fichier texte.
    Par Mike888 dans le forum C
    Réponses: 3
    Dernier message: 24/05/2007, 11h45
  3. [WIN32]problème de Lecture d'un fichier texte
    Par jesus144 dans le forum Windows
    Réponses: 14
    Dernier message: 23/02/2007, 11h40
  4. [VBnet] Problème de lecture d'un fichier texte.
    Par dibeloni dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2006, 19h12
  5. Réponses: 2
    Dernier message: 28/12/2005, 15h00

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