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 :

réutilisation de istringstream


Sujet :

SL & STL C++

  1. #1
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut réutilisation de istringstream
    Bonjour,
    En quelques lignes voilà mon problème.
    Je parse un fichier. Pour cela j'utilise un std::ifstream. Je lit mes lignes avec std::getline dans un std::string. Ensuite j'injecte mon std::string dans un std::istringstream (avec istringstream::set(string)). Puis je parse de std::istringstream pour en extraire des données.
    Ca marche dans 80% des cas. Donc mon problème est dans les 20% restant.
    Le comportement problématique: Dans une fonction de lecture, je lit une première ligne, je la parse -> pas de problème. Puis j'utilise la même variable pour lire la ligne suivante et la parser: erreur grave: en fait fail() me retourne l'état d'erreur.
    Trois observation:
    1/ Dans certain cas, ce même séquencement de code fonctionne,
    2/ Lorsque ça ne marche pas, si je rajoute un espace à la fin du flux, ca fonctionne.
    3/ Lorsque ça ne marche pas, si au lieu d'ajouter un espace, j'utilise deux variables, alors ca fonctionne.

    D'où cela peut-il venir? Peut-on 'reinitialiser' un flux (j'ai pas trouvé en tout cas).

    Voici les deux bouts de codes incriminés:
    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
     
    // Lit tout simplement la ligne et la transforme en istringstream:
    	bool LireLigne(std::istringstream&P_strLigne)
    	{
    		bool L_bErreur;
    		L_bErreur = false;
    		// Lecture de l'entete:
    		std::string L_strLigneCourante;
    		// Premiere ligne
    		std::getline(*this->Flux(),L_strLigneCourante);
    		if(this->Flux()->fail()){
    			L_bErreur = true;
    		}
    		else{
    			P_strLigne.str(L_strLigneCourante);
    		}
     
    		return !L_bErreur;
    	}
    et :
    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
    bool CSolCirLecteurFace::LireElement(){
    	bool L_bErreur;
    	std::istringstream L_strLigne;
    
    	L_bErreur = true;
    	if(LireLigne(L_strLigne)){
    		int L_iNbrContour;
    		std::string L_strNomFace;
    		L_strLigne>>L_strNomFace>>L_iNbrContour;
    		if(!L_strLigne.fail()){
    			Nom(L_strNomFace);
    			if(L_iNbrContour>0){
    				L_bErreur = !InitialiserNbContours(L_iNbrContour);
    			}
    		}
    	}
    
    	if(!L_bErreur){
    		L_bErreur = true;
    		// Lecture de la normale:
    		if(LireLigne(L_strLigne)){
    			double L_dNormaleX;
    			double L_dNormaleY;
    			double L_dNormaleZ;
    			L_strLigne>>L_dNormaleX>>L_dNormaleY>>L_dNormaleZ;
    			if(!L_strLigne.fail()){
    				Normale(CSolVecteur3D(L_dNormaleX,L_dNormaleY,L_dNormaleZ));
    				L_bErreur = false;
    			}
    			else{
    			   // c'est ici que ca échoue!
    			}
    		}
    	}
    	return !L_bErreur;
    }
    P.S.: j'ai essayé de simplifier à fond pour tenter de reproduire le pb et je n'y arrive pas. En faisant simplement une fonction qui ouvre un fichier et lit deux lignes, je n'ai pas d'erreurs (ce qui est peut être suspect sur le reste de mon code).

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    OK ca marche. En fait, je n'avais pas exploré cette solution car clear indique qu'il réinitialise l'état d'erreur (flags bad, fail, eof). Or, premièrement, je n'arrive pas à mon point de code avec l'état d'erreur. Et ensuite, ben j'ai pas pensé que l'état eof n'était pas réinitialisé. Cela semble être le cas, du coup ma seconde lecture échoue car le flux a le bit eof positionné.
    Merci pour la réponse et pour sa rapidité.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Quand même, ce qui m'a troublé c'est qu'en ajoutant un espace, la fonction n'échoue plus. Alors que réinitialiser le contenu du flux non. Probablement, que MonFlux+" " réinitialise le bit eof, alors que MonFlux.str(blabla) ne le change pas. Troublant, non?

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Troublant, non?
    Aprés je ne sait pas si c'est le plus propre....

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    C'est à moitié propre puisqu'ainsi je réinitialise l'état de mon flux en même temps que je réinitialise les données.
    La où ce serait plus 'sale', c'est que dans l'esprit, je me demande si je ne devrais pas faire monFlux+=MaNouvelleLigne plutôt que MonFLux.str(MaNouvelleLigne).

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Réutiliser un stringstream n'est pas très propre. L'idiome classique pour parser un fichier ligne par ligne c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    std::string line;
    while(std::getline(flux, line))
    {
      std::istringstream parser(line);
      parser >> ...;
      if (!parser)
      {
        // erreur de format
      }     
    }
    if (!flux.eof())
    {
      // erreur d'IO
    }

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

Discussions similaires

  1. réutilisation de composant
    Par La March dans le forum C++Builder
    Réponses: 8
    Dernier message: 14/04/2005, 15h41
  2. [VB.NET] Probleme pour réutiliser une sockets ??
    Par fdiedler dans le forum Windows Forms
    Réponses: 12
    Dernier message: 10/03/2005, 14h37
  3. std::istringstream
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 31/01/2005, 10h23
  4. [C#] [VS.NET] Réutiliser une Form d'une application windows?
    Par yannick_sch dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/10/2004, 14h28
  5. [Juridique] Comment réutiliser le code source d'une classe ?
    Par mathieu dans le forum Général Java
    Réponses: 8
    Dernier message: 17/05/2004, 13h40

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