Grande découverte aujourd’hui !
Considérons le bout de code suivant :
std::fstream stream;
std::string str;
stream.open("toto.txt", std::ios_base::in);
// read until the end and print the content
while (std::getline(stream, str).eof() == false)
std::cout << str;
// rewind
stream.seekp(0);
// re-read
while (std::getline(stream, str).eof() == false)
std::cout << str;
A priori, le contenu est affiché 2 fois de suite ? Ben non … la première boucle atteint la fin du fichier. Or la fonction std::getline, lorsqu’elle atteint la fin du stream, fait appel à la méthode setstate(failbit) dudit stream.
Et seekp ne reset pas cet état !! Ce qui fait qu’à la prochaine lecture, lorsque l’on teste si l’on est à la fin du fichier, le test est vérifié dès le début !
Il faut donc réinitialiser les bits d’information du stream avant de faire le seekp pour que ça marche :
stream.clear();
stream.seekp(0);
Là la deuxième boucle affiche bien le contenu. C’est un peu étrange que seekp ne puisse pas réinitialiser le bit de fin de fichier tout seul …