Warum löst std :: copy (von istream zu ostream) eine ios :: failure-Ausnahme aus?

8

Der folgende Code sollte Daten von einem wifstream zu wcout kopieren. Nachdem der Inhalt kopiert wurde, löst das Programm eine ios :: failure-Ausnahme aus.

%Vor%

Der Stream sollte nur dann eine Ausnahme auslösen (siehe Ausnahmemaske), wenn etwas schief geht, aber nicht auf EOF.

    
cytrinox 04.11.2010, 17:25
quelle

3 Antworten

1

Um das Überspringen von Leerraum zu vermeiden, verwenden Sie std :: istreambuf_iterator

%Vor%

Die Ausnahme:

Die lokale Komponente kann eine Codecvt-Facette verwenden, die fehlschlägt.
Versuchen Sie, die Gebietsschema-Zeile zu kommentieren, um zu sehen, was passiert.

Haben Sie versucht zu drucken, was die Ausnahmen sind?

%Vor%     
Martin York 04.11.2010, 17:31
quelle
1

Da Sie std::istream_iterator verwenden, wird beim Versuch, ein Zeichen nach dem Ende des Streams zu lesen, sowohl eofbit als auch failbit gesetzt (und erst nachdem einige Fehlerbits gesetzt sind, wird der Iterator gleich dem Ende Iterator)

Um auf das Wesentliche zu verzichten und zu char zurückzukehren, um es noch einfacher zu machen, entspricht das Programm:

%Vor%     
Cubbi 04.11.2010 17:45
quelle
0

Gemäß §27.6.1.2.3 / 10:

  

Nachdem ein Sentry-Objekt erstellt wurde, wird ein Zeichen aus in extrahiert, sofern eines verfügbar ist, und in c gespeichert. Andernfalls ruft die Funktion in.setstate (failbit) auf.

Wenn also das Ende der Datei erreicht wird und Sie kein Zeichen mehr extrahieren können, wird das Fail-Bit gesetzt, das Sie als Ausnahme festgelegt haben. Die Verwendung von std::copy ändert nicht das Verhalten - ein istream_iterator liest über operator>> .

Sie können die Datei etwas einfacher kopieren:

%Vor%     
Jerry Coffin 04.11.2010 17:46
quelle

Tags und Links