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.