2012-04-13 1 views
6

Ich würde gerne wissen, ob und warum seekg(0) nicht die eofbit eines Streams löschen soll. Ich bin an einem Punkt wo ich schon den ganzen Stream gelesen habe, also EOF erreicht wurde (aber failbit ist noch nicht gesetzt) ​​und möchte mit seekg() wieder in eine gültige Position gehen und ein paar Zeichen nochmal lesen. In diesem Fall scheint seekg(0) mit dem eofbit Satz "zu arbeiten", aber sobald ich versuche, vom Strom zu lesen, wird der failbit eingestellt. Ist diese Logik richtig oder ist meine Implementierung schlecht? Soll ich diesen Fall erkennen und das Eofbit manuell löschen (wenn das Failbit nicht gesetzt ist)?Warum seekg (0) den eof-Status des Streams nicht löschen?

EDIT:

Das folgende Programm von einem Leser unterschiedliche Resultate in meiner Implementierung gibt (. Mingw32-C++ exe (TDM-2 mingw32) 4.4.1):

#include <sstream> 
#include <iostream> 
#include <string> 

int main() { 
     std::istringstream foo("AAA"); 
     std::string a; 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo.seekg(0); 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 
} 

Die Kommentare oben sind von dem Benutzer, der dieses Programm in seiner Implementierung ausprobiert hat. Ich erhalten diese Ergebnisse:

1 0 
1 0 
1 1 
1 1 
+0

Ja, Sie müssen manuell den Zustand des Stroms zurückzusetzen. –

+0

@Martin: Scheint der alte Standard gegen neue Standardausgabe zu sein. – Anonymous

Antwort

2

Nach dem neuen Standard clear() soll die eofbit (§ 27.7.2.3) zurück:

basic_istream<charT,traits>& seekg(pos_type pos);

Effekte: Verhält sich als unformatierte Eingabefunktion ..., mit der Ausnahme, dass die Funktion zuerst eofbit ...

B ut in der alten Standard (§ 27.6.1.3) gibt es keine Erwähnung des Löschens der eofbit!

Und ein einfacher Test:

#include <sstream> 
#include <iostream> 
#include <string> 

int main() { 
     std::istringstream foo("AAA"); 
     std::string a; 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo.seekg(0); 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 
} 
+0

Nach deinem ersten foo.seekg (0), wird das Eofbit in deinem Beispiel gelöscht, während es noch in meiner Implementierung ist. Deshalb fragte ich, dass etwas Seltsames passieren könnte. Ihr Programm gibt 1 0, 1 0, 1 1, 1 1 – Martin

+0

@Martin: Guter Punkt. Welcher Compiler und welche Umgebung? Ich bekomme die geposteten Ergebnisse mit: 'clang 3.1',' gcc 4.7.0' und 'gcc 4.6.3' (mit und ohne' -std = C++ 0x'). Aber mit 'VS2010' bekomme ich das selbe Ergebnis wie du. – Anonymous

+0

Ein bisschen oldish [Dokument] (http://support.microsoft.com/kb/146445) von Microsoft kann etwas Licht auf das Problem werfen. ** Status: ** _Dieses Verhalten ist beabsichtigt._ Und der Standard ...? – Anonymous

0

Warum nicht einfach manuell löschen() der Strom dann wieder einmal die eofbit gesetzt wurde? EOF wurde erreicht, warum sollte es automatisch gelöscht werden? Das würde mehr Probleme verursachen.