Les joies des file streams …

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 …

Leave a Reply

Your email address will not be published. Required fields are marked *