2012-12-05 10 views
6

Der folgende Code funktioniert mit gcc 4.4.
Aber gcc 4.7 wird Assertionsfehler geben.GCC 4.7 istream_tellg() gibt -1 zurück, nachdem EOF erreicht wurde

In gcc 4.7, wenn der istream EOF erreicht hat, wird tellg() -1 zurückgeben. Kein pubseekoff() oder seekoff() wird genannt werden. In gcc 4.4 ist das kein Problem.

Was soll das Verhalten sein, gcc 4.4 oder gcc 4.7? Warum?

+0

Ein wenig verwirrt. Warum wird 'iss.eof()' nach der Extraktion nicht gesetzt? –

+0

Es wurde von gcc 4.6 behoben, hier [ist der Fehlerbericht] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26211). –

+0

Dieser Fehlerbericht hat nicht zu viel Beschreibung. Die Dateien wurden geändert, beziehen sich jedoch auf das aktuelle Problem. Wie haben Sie diesen Bugfix mit dem aktuellen Problem in Verbindung gebracht? –

Antwort

5

Nach C++ 11 Abschnitt 27.7.2.3p40,

wenn fail() != false, kehrt pos_type(-1)

gcc So 4.7 das richtige Verhalten für die aktuelle Version von C++ hat (unter der Annahme, dass peek() am Ende des Streams verursacht failbit gesetzt werden, und es während der Wache Aufbau tut, seit skipws ist standardmäßig eingestellt).

Mit Blick auf die Formulierung von C++ 03 ist es das gleiche. 27.6.1.3p37. Das Verhalten, das Sie in gcc 4.4 beschreiben, ist ein Fehler.

1

Um genau zu sein, eofbit wird tellg() nicht zurückgeben -1. Aber die Tatsache, dass Sie lesen nach EOF setzt die failbit, und tellg() wird -1 zurückgeben, wenn badbit oder failbit gesetzt sind.

Die Lösung ist die Status-Flags zu löschen, bevor Aufruf tellg():

iss.clear(); 
iss.tellg(); // should work 
Verwandte Themen