Est-ce un bug avec cout et getline en g ++ 4.7.2?

2012/11/13 Mise à jour: j’ai trouvé que ma question avait déjà été posée. Voici une bonne solution pour gérer différents fichiers texte de fin de ligne: Obtenir std :: ifstream pour gérer LF, CR et CRLF?

Est-il possible de consortingbuer à libstdc ++? Comment?


2012/11/11

J’ai trouvé que quelque chose ne va pas avec cout.
S’il y a deux chaînes renvoyées par getline (),
la deuxième chaîne remplacera la première dans la sortie.

Ceci est un exemple de code:

#include #include using namespace std; int main() { //normal code cout << "Normal result:" << endl; string str1 = "hello"; cout << str1; str1 = "123"; cout << str1; cout << endl; //broken code cout << "Bug?" << endl; ifstream fin; fin.open("test.dat"); string str; getline(fin, str); cout << str; getline(fin, str); cout << str; fin.close(); return 0; } 

Et voici le fichier d’entrée (test.dat):

 hello 123 

Le résultat sera:

 Normal result: hello123 Bug? 123lo 

J’utilise Ubuntu 12.10 64-bit,
et la version du compilateur est g ++ (Ubuntu / Linaro 4.7.2-2ubuntu1) 4.7.2.
Aucun conseil? Est-ce qu’il y a quelqu’un qui me dit où déposer un bug?

Plus probable qu’un bogue dans libstdc ++ (qui peut se produire aussi bien que dans gcc, mais sont plutôt rares de nos jours), il y a une terminaison de ligne incorrecte dans votre fichier d’entrée – il utilise probablement les fins de ligne DOS / Windows CR+LF qui – comme getline() supprime le LF – entraîne la deuxième chaîne écrite sur le premier. Vous pouvez facilement voir cela, si vous exécutez la sortie de votre programme via une sorte de dumper hexadécimal, par exemple xxd .

Soit vérifier \r à la fin des chaînes lues (btw, MacOS à version 9 utilisé uniquement comme marqueur EOL), corriger votre saisie ou append de nouvelles lignes à la sortie lors de l’impression.