Po przeczytaniu wszystkich danych ze strumienia, ale nie próbuję czytać poza jego końcem, strumień EOF strumienia nie jest ustawiony. Tak działają strumienie C++, prawda? To jest powód, to działa:Dlaczego std :: ios_base :: ignore() ustawia 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);
}
Jeśli jednak zamiast read()
ing dane mi ignore()
go, EOF jest ustawiona:
#include <sstream>
#include <cassert>
int main()
{
std::stringstream ss("abcdef");
ss.ignore(6);
assert(!ss.eof()); // <-- FAILS
assert(ss.tellg() == 6); // <-- FAILS
}
Jest na GCC 4.8 oraz tułowia GCC (Coliru).
Posiada również niefortunny efekt uboczny wytwarzania tellg()
zwrot -1
(bo to co robi tellg()
), co jest irytujące dla co robię.
Czy to wymaga normy? Jeśli tak, który fragment i dlaczego? Dlaczego ignore()
próbował przeczytać więcej, niż mu powiedziałem?
Nie mogę znaleźć żadnego powodu dla tego zachowania na cppreference's ignore()
page. Zamiast tego prawdopodobnie mogę .seekg(6, std::ios::cur)
, prawda? Ale nadal chciałbym wiedzieć, co się dzieje.
Wow, to działa na MSVS. Oblało to również klir na coliru. Myślę, że może to być biblioteka, a nie sam kompilator. – NathanOliver
co się stanie, jeśli podasz inny 'delim' oprócz' eof'? – dwcanillas
@dwcanillas: [Bez zmian] (http://coliru.stacked-crooked.com/a/bdb33a4a1a87e593). –