Spulen Sie ein ifstream-Objekt zurück, nachdem Sie das Ende der Datei erreicht haben

8

Wenn Sie eine Textdatei mit ein paar Zeichen haben (sagen wir 10), können Sie versuchen, 1000 Zeichen davon zu lesen.

%Vor%

Dies setzt natürlich das eofbit Flag (und das failbit ), Sie können jedoch die gewünschten Zeichen erhalten.

Angenommen, Sie möchten die Datei erneut lesen (von Anfang an):

%Vor%

Das funktioniert nicht, wenn Sie

anrufen %Vor%

Sie werden feststellen, dass count == 0 . Das heißt, es hat überhaupt nichts gelesen.

Daher die Frage: Wie können Sie die Datei nach dem Ende der Datei aufheben?

    
Raydel Miranda 04.02.2015, 20:40
quelle

1 Antwort

24

Lösung

Verwenden Sie clear , um den Status des ifstream vor dem Aufruf seekg zu bereinigen. Überprüfen Sie zuerst, ob Sie den Status später kennen müssen.

%Vor%

Erklärung

seekg legt die Eingabeposition fest, nicht jedoch clear Geben Sie das Bit failbit ein, damit ifstream Instanz" denkt "es ist etwas nicht in Ordnung.

Aus der Standardspezifikation:

  

std :: basic_istream :: seekg verhält sich außer UnformattedInputFunction Das gcount () ist nicht betroffen.

Und wir können in UnformattedInputFunction nachlesen:

  

Die folgenden Standardbibliotheksfunktionen sind UnformattedInputFunctions :

     

basic_istream :: seekg , mit Ausnahme von , dass es zuerst eofbit löscht und gcount nicht ändert

Wenn Sie im Fallbeispiel den Status vor und nach dem Suchvorgang ausgeben, erhalten Sie:

%Vor%

Darum !!

seekg löscht failbit nicht und aus irgendeinem Grund funktioniert es nicht mit einem solchen Bit aktiviert.

Meine Vermutung

Warum seegk funktioniert nicht, wenn failbit aktiviert ist?

Es hat damit zu tun, dass dieses Bit nicht nur aktiviert wird, wenn der Stream das Ende der Datei erreicht. Und es kann Situationen geben, in denen nach der Aktivierung von Failbit gseek fehleranfällig ist oder ein undefiniertes Verhalten zeigt.

    
Raydel Miranda 04.02.2015, 20:40
quelle

Tags und Links