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:
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 // 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; }
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).
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; }
Partager