2012-04-11 10 views
1

Ich möchte Ifstream verwenden, um Daten von einem named piped zu lesen. Ich möchte seinen Operator >> verwenden, um formatierte Daten zu lesen (normalerweise ein int). Allerdings bin ich ein wenig verwirrt in der Art, wie die Fehlerbehandlung funktioniert.Ifstream-Operator >> und Fehlerbehandlung

Stellen Sie sich vor, ich möchte ein int lesen, aber nur 3 Bytes sind verfügbar. Fehlerbits würden gesetzt werden, aber was wird mit diesen 3 Bytes passieren? Werden sie "verschwinden", werden sie zur späteren Extraktion in den Strom zurückgelegt?

Danke,

+3

'Operator >>' wird nicht lesen ein (vier-Byte oder was auch immer) binäre ganze Zahl. Es liest die textuelle Darstellung einer ganzen Zahl. –

+0

Nun, ich denke, das löst meine Frage ... Irgendwelche Ratschläge, wie ich das manuell handhaben sollte? Kann ich die putback() -Methode verwenden, um es später erneut zu versuchen, wenn read() nicht mindestens 4 Bytes gelesen hat? Und wenn dies der Fall ist, erstelle ich meine int mit diesen 4 Bytes manuell? – Xaqq

+1

In der Tat bedeutet das "formatiert" in diesem Zusammenhang. Wenn Sie _binary_ Daten lesen möchten, ist das eine 'unformatierte Eingabe'. – ildjarn

Antwort

1

Wie bereits erwähnt, können Sie nicht eine binäre Daten über istream lesen. Aber in Bezug auf die Anzahl der verfügbaren Bytes Ausgabe (da Sie wollen wahrscheinlich basic_ios<char> und streambuf für binäre Ströme verwenden): istream und ostream ein streambuf für die eigentliche Beschaffung und Untergang des Bytes verwenden. Und streambuf normalerweise Puffer: die Prozedur ist: Wenn ein Byte im Puffer ist, geben Sie es zurück, andernfalls versuchen Sie laden Sie den Puffer, warten bis das Nachladen beendet ist, oder definitiv fehlgeschlagen. Im Falle eines definitiven Fehlers gibt streambuf das Ende der Datei zurück, und das beendet die Eingabe; istream wird das Dateiende speichern und keine Eingabe mehr versuchen. Wenn also der Typ , den Sie lesen, vier Bytes benötigt, fordert er vier Bytes von streambuf an und wartet normalerweise, bis diese vier Bytes dort sind. Kein Fehler wird gesetzt (weil kein Fehler vorliegt); Sie werden einfach nicht von der operator>> zurückkehren, bis diese vier Bytes ankommen.

Wenn Sie Ihre eigenen binären Streams implementieren, würde ich dringend mit dem gleichen Muster empfehlen; es erlaubt die direkte Verwendung bereits existierender Standardkomponenten wie std::ios_base und (vielleicht) std::filebuf, und stellt anderen Programmierern eine Sprache zur Verfügung, mit der sie vertraut sind. Wenn die Blockierung ein Problem ist, besteht die einfachste Lösung darin, den Eingang in einem separaten Thread auszuführen und über eine Nachrichtenwarteschlange oder etwas Ähnliches zu kommunizieren. (Boost unterstützt asynchrone IO. Dies vermeidet Threads, ist aber global viel komplizierter und funktioniert nicht gut mit dem klassischen Stream-Idiom.)