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 :

Lecture de fichier : Probleme avec les string


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut Lecture de fichier : Probleme avec les string
    En lisant un fichier, je recupere les lignes par getline(fichier, string).
    Mais le probleme est le resultat: On dirait que pour la premiere boucle, les strings decalent le reste d'un cran. Je ne vois pas comment l 'expliquer.
    Peut etre est ce un probleme de buffer, mais je ne suis pas du tout familier avec cela.

    voici un morceau du code:
    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
     
    specfile.clear(); 
    	specfile.seekg(0); //On remet le marqueur en début de fichier
     
    	for (j=0;j<6;++j)
    	{
    		getline(specfile,temp);
    		cout << "1:" << temp << endl;
    		getline(specfile,temp);
    		cout << "2:" << temp << endl;
    		if (temp!="NUL")
    		{
    			for (i=0;i<Nblines[j];++i)
    			{
    				specfile >> SpUser[j][i][0];
    				specfile >> SpUser[j][i][1];
    			}
    			if (Nblines[j]!=lines)
    			{
    				for (i=Nblines[j];i<lines;++i)
    				{
    					SpUser[j][i][0]=SpUser[j][Nblines[j]-1][0];
    					SpUser[j][i][1]=SpUser[j][Nblines[j]-1][1];
    				}
    			}
    		}
    		else //Spectre totalement nul
    		{
    			for (i=0;i<lines;++i)
    			{
    				SpUser[j][i][0]=SpUser[j][i][1]=0;
    			}
    		}
    		getline(specfile,temp);
    		cout << "3:" << temp << endl; 
    	}
    	specfile.close();
    En regardant les affichages (1, 2 et 3)
    On s apercoit que 1 et 2 sont corrects ( apres verification) mais c au 3
    que tout est decalé d'un cran.
    Pour le reste de la boucle, ce qui devrait commencer a 1 commence a 2.

    Si vous desirez le fichier d'entree et le code entier pour tester la routine, il n'est pas tres long car il est separe du projet actuel.

    Merci

  2. #2
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Tu as essayé de retirer ton bloc if else ?
    De juste garder les 3 getlines dans un for en gros.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       specfile.clear(); 
       specfile.seekg(0); //On remet le marqueur en début de fichier
       for (j=0;j<6;++j) 
       { 
          getline(specfile,temp); 
          cout << "1:" << temp << endl; 
          getline(specfile,temp); 
          cout << "2:" << temp << endl; 
          getline(specfile,temp); 
          cout << "3:" << temp << endl; 
       } 
       specfile.close();
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Apres une journee entiere consacree au debogage, j ai pu trouver dans un bouquin qu'on peut utiliser la fonction ignore() d'un string.
    Je l'ai donc mise apres le 3e appel a getline, et ca marche.

    Par contre je ne sais pas du tout pourquoi ca marche ...
    Il y a une histoire de retour chariot dans le buffer non?
    Quelqu un en saurait il un peu plus sur cela?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu extrais des nombres (ou autre chose via l'opérateur d'extraction : >>) entre deux std::getline ?
    Ouverture du fichier en mode "binaire" ? (hyppothèse en l'air)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Le fichier est ouvert en mode texte.
    J extrais a la fois des chaines de caracteres ( pour les 3 getline)
    et des nombres pour les boucles interieures.
    En gros si j utilise getline, c est que j ai une chaine de caractere, sinon ce sont des nombres

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ah ben voilà.
    Après le >>, il te faut finir de purger (std::istream::ignore) jusqu'à la fin de la ligne si tu comptes ensuite faire un std::getline.

    De ce que j'ai compris, la lecture détecte le caractère après le dernier chiffre (ou autre qui n'est pas un espace), mais ne le lit pas. Le curseur resterait donc positionné juste avant l'espace (sauts de lignes, et fins de fichiers compris). De fait le getline lirait donc une ligne vide.

    On retrouve le même principe que celui qui fait que l'on ne peut pas écrire de boucle de lecture sur eof. => il faut tester le résultat de chaque lecture avant de passer à la suite.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Je n'ai pas tout compris, mais déja la piste s'eclaire!

    Apres le dernier appel à >>, tu dis donc que le curseur reste planté la, et ne passe pas a la ligne suivante, ce qui entraine une lecture d'un retour chariot en plus de la ligne qui vient après ?

    Et a propos de la lecture sur eof, j aimerais en savoir plus sur ce que tu veux dire, car je ne vois pas trop.

    Merci bcp

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Oui. C'est presque ça. Le saut de ligne est remarqué, comme un simple espace, mais non lu. Résultat std::getline le lit et s'y arrête, sans continuer avec la ligne qui suit.

    Pour eof, recherche mes interventions avec "eof" en mot clé. Ou bien, regarde la FAQ (de sûr c'est dans la FAQ C++ lite, pour celle d'ici, j'ai oublié)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Pour le eof, j ai lu un des posts que tu avais fait, il m'a un peu eclaire, merci. J ai tendance a utiliser eof pour lire un fichier.

    Par contre je suis toujours perplexe.
    Car si ce que l on a dit est bon, il suffirait de mettre un ignore() avant le prochain appel a getline() (le 3e), et tout est bon. Mais non, ce n est pas le cas apres un autre essai. J ai mis le ignore() apres le getline() pour que ca marche.

    Une idée?

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le ignore ne doit pas avoir lieu avant le 3e getline, mais après le dernier >> dans ta boucle qui arrive de temps à autres.
    De ce que je vois de ton code, tous les chemins qui mênent au 3e getline ne passent pas par >>.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    OK!!
    Je vois maintenant...

    Merci beaucoup Luc pour ton aide

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

Discussions similaires

  1. Tout petit probleme avec les string
    Par bixi dans le forum Delphi
    Réponses: 4
    Dernier message: 06/06/2006, 09h46
  2. Extraction fichier Excel - Probleme avec les VbCrLf
    Par oromeyer dans le forum Modules
    Réponses: 3
    Dernier message: 16/02/2006, 19h06
  3. Probleme avec les fichier faire un copier coller
    Par mcdonald dans le forum Général Python
    Réponses: 4
    Dernier message: 29/01/2006, 13h38
  4. probleme avec les string sur ITA2 64 bits!
    Par vince3320 dans le forum SL & STL
    Réponses: 5
    Dernier message: 22/08/2005, 19h59
  5. [VB.NET] Probleme avec les fichiers!!
    Par ludovic85 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/01/2005, 17h12

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