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 averti
    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
    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 chevronn� Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    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();

  3. #3
    Membre averti
    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
    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 confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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 averti
    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
    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 confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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 averti
    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
    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 confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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 averti
    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
    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 confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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 averti
    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
    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