Lorsque je lis toutes les données d'un flux, mais ne tente pas de lire au-delà de sa fin, le flux EOF n'est pas défini. C'est comme ça que fonctionnent les flux C++, n'est-ce pas? C'est la raison pour laquelle cela fonctionne:Pourquoi std :: ios_base :: ignore() définit le bit EOF?
#include <sstream>
#include <cassert>
char buf[255];
int main()
{
std::stringstream ss("abcdef");
ss.read(buf, 6);
assert(!ss.eof());
assert(ss.tellg() == 6);
}
Cependant, si au lieu de read()
données ing je ignore()
il, EOF est définie:
#include <sstream>
#include <cassert>
int main()
{
std::stringstream ss("abcdef");
ss.ignore(6);
assert(!ss.eof()); // <-- FAILS
assert(ss.tellg() == 6); // <-- FAILS
}
Ceci est le GCC 4.8 et le tronc GCC (Coliru).
Il a également effet secondaire malheureux de faire tellg()
retour -1
(parce que ce tellg()
fait), ce qui est gênant pour ce que je fais.
Est-ce que cette norme est obligatoire? Si oui, quel passage et pourquoi? Pourquoi est-ce que ignore()
tenterait de lire plus que je ne le lui avais dit?
Je ne trouve aucune raison pour ce comportement sur cppreference's ignore()
page. Je peux probablement .seekg(6, std::ios::cur)
à la place, non? Mais j'aimerais quand même savoir ce qui se passe.
Wow, cela fonctionne sur VSM. Il a également échoué avec clang sur coliru. Je pense que ce pourrait être la bibliothèque et non le compilateur lui-même. – NathanOliver
que se passe-t-il si vous spécifiez un 'delim' différent de' eof'? – dwcanillas
@dwcanillas: [Pas de changement] (http://coliru.stacked-crooked.com/a/bdb33a4a1a87e593). –