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.
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% 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%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%