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.)
'Operator >>' wird nicht lesen ein (vier-Byte oder was auch immer) binäre ganze Zahl. Es liest die textuelle Darstellung einer ganzen Zahl. –
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
In der Tat bedeutet das "formatiert" in diesem Zusammenhang. Wenn Sie _binary_ Daten lesen möchten, ist das eine 'unformatierte Eingabe'. – ildjarn