Warum ruft getline () 'std :: ios_base :: failure' aus, wenn die Ausnahmemaske nicht auf eofbit gesetzt ist?

8

Betrachten Sie den folgenden Code:

%Vor%

Also:

  1. Ich habe die folgende "Ausnahmemaske" (ifstream :: failbit | ifstream :: badbit) für die Bedürfnisse des try-catch-Blocks gesetzt. Die Datei wird ohne Probleme geöffnet.
  2. In while {} block weiß ich, dass am Ende der Datei eofbit gesetzt wird. Aber
  

Die Ausnahmemaske ist ein interner Wert aller Stream-Objekte   Festlegen, welche Statusflags eine Ausnahme auslösen müssen , wenn sie es sind   Stellen Sie ein.

Ich habe ifstream :: eofbit NICHT gesetzt, aber zur Laufzeit erscheint folgender Fehler:

%Vor%

Ich kann dieses Verhalten nicht verstehen. Ich habe versucht, in.clear () direkt vor während {} zu verwenden, aber ohne Wirkung. clear () selbst setzt goodbit , und soweit ich es verstehe, "Flags müssen eine Exception werfen" (siehe Zitat oben), aber wenn googbit gesetzt ist, verursacht es nicht um irgendwelche Ausnahmen zu werfen ...

Wenn Sie

löschen möchten %Vor%

es funktioniert.

Wie funktioniert getline () in diesem Fall?

    
Razorfever 30.11.2012, 18:34
quelle

1 Antwort

7

Das Problem liegt in Ihrer Eingabe-Iteration. eofbit wird nur gesetzt, wenn der letzte Lesevorgang EOF erreicht hat, nicht wenn der nächste Lesevorgang nur EOF lesen soll. Wenn letzteres eintritt, wird failbit gleichzeitig gesetzt. Siehe die Diskussion hier .

Wenn in Ihrem speziellen Fall die Datei mit einem Zeilenumbruch endet (wie es wahrscheinlich der Fall ist), liest% ce_de% diesen Zeilenumbruch vor und kehrt zurück. getline() ist immer noch nicht gesetzt. Das nächste eofbit trifft dann direkt auf EOF und gemäß seiner Dokumentation: "Wenn die Funktion keine Elemente extrahiert, ruft sie getline() auf."

    
Angew 30.11.2012, 18:38
quelle

Tags und Links