Ich versuche ein bisschen mehr darüber zu lernen, wie E / A-Streams in C ++ funktionieren, und ich bin wirklich verwirrt, wann ich was verwenden soll.
Was genau ist ein streambuf
?
Wann verwende ich a streambuf
im Vergleich zu a string
, an istream
oder a vector
? (Ich kenne die letzten drei bereits, aber nicht, wie sie streambuf
mit ihnen verglichen werden, wenn überhaupt.)
Antworten:
Stream-Puffer stellen Eingabe- oder Ausgabegeräte dar und bieten eine Low-Level-Schnittstelle für unformatierte E / A für dieses Gerät. Ströme, andererseits bieten eine höhere Ebene Wrapper um die Puffer mittels basischer unformatierte I / O - Funktionen und insbesondere über formatierten E / A - Funktionen (dh
operator<<
undoperator>>
Überlastungen). Stream-Objekte können auch die Lebensdauer eines Stream-Puffers verwalten.Beispielsweise verfügt ein Dateistream über einen internen Dateistreampuffer. Der Stream verwaltet die Lebensdauer des Puffers und der Puffer bietet die tatsächlichen Lese- und Schreibfunktionen für eine Datei. Die Formatierungsoperatoren des Streams greifen letztendlich auf die unformatierten E / A-Funktionen des Stream-Puffers zu, sodass Sie immer nur die E / A-Funktionen des Streams verwenden müssen und die E / A-Funktionen des Puffers nicht direkt berühren müssen.
Eine andere Möglichkeit, die Unterschiede zu verstehen, besteht darin, die unterschiedlichen Verwendungszwecke von Gebietsschemaobjekten zu betrachten. Streams verwenden die Facetten, die mit Formatierungen wie
numpunct
und zu tun habennum_get
. Sie können auch erwarten, dass die Überladungen von Streamsoperator<<
undoperator>>
für benutzerdefinierte Zeit- oder Gelddatentypen die Zeit- und Geldformatierungsfacetten verwenden. Stream-Puffer verwenden jedoch die Codecvt-Facetten, um zwischen den Einheiten, die ihre Schnittstelle verwendet, und den Bytes zu konvertieren. So wird beispielsweise die Schnittstelle fürbasic_streambuf<char16_t>
Verwendungenchar16_t
und damitbasic_streambuf<char16_t>
interncodecvt<char16_t, char, mbstate_t>
standardmäßig verwendet, um diechar16_t
in den Puffer geschriebenen formatierten Einheiten in zu konvertierenchar
Einheiten, die auf das zugrunde liegende Gerät geschrieben wurden. Sie können also sehen, dass Streams hauptsächlich zum Formatieren dienen und Stream-Puffer eine Low-Level-Schnittstelle für unformatierte Ein- oder Ausgabe an Geräte bieten, die möglicherweise eine andere externe Codierung verwenden.Sie können einen Stream-Puffer verwenden, wenn Sie nur unformatierten Zugriff auf ein E / A-Gerät wünschen. Sie können auch Stream-Puffer verwenden, wenn Sie mehrere Streams einrichten möchten, die einen Stream-Puffer gemeinsam nutzen (obwohl Sie die Lebensdauer des Puffers sorgfältig verwalten müssen). Es gibt auch spezielle Stream-Puffer, die Sie möglicherweise verwenden möchten, z. B.
wbuffer_convert
in C ++ 11, das als Fassade für a dientbasic_streambuf<char>
, damit es wie ein breiter Zeichen-Stream-Puffer aussieht. Es wird die Codecvt-Facette verwendet, mit der es erstellt wurde, anstatt die Codecvt-Facette zu verwenden, die an ein Gebietsschema angehängt ist. Normalerweise können Sie den gleichen Effekt erzielen, indem Sie einfach einen breiten Stream-Puffer verwenden, der von einem Gebietsschema mit der entsprechenden Facette durchdrungen ist.quelle
streambuf
gilt für Rohdaten (z. B. Rohbytes, Rohints) usw.), währendstream
für gekochte Daten (Text, als Text formatierte Ganzzahlen usw.) gilt. Anders ausgedrückt,stream
repräsentiert die Analyse- (oder Serialisierungs-) Ebene. Wenn Sie mit einfachen Zeichenfolgen arbeiten, können Sie beide technisch verwenden, aber die Bedeutung ist unterschiedlich:streambuf
Bedeutet, dass die Rohdaten die Zeichenfolge selbst sein sollen, währendstream
die Codierung abstrahiert wird.stream
, dass die Kodierung abstrakt ist ? : D Können Sie es etwas näher erläutern oder weiteres Material bereitstellen?stream
ist verantwortlich für das Lesen und Schreiben von Objekten an astreambuf
.streambuf
ist verantwortlich für das Speichern und Wiederherstellen von Bytes (oder Zeichen / Wörtern / wie auch immer Sie sie nennen möchten) von einem Byte-Speicherort. Die Zuordnung zwischen Objekten und Bytes habe ich als "Codierung" bezeichnet. Ein Beispiel hierfür ist, dass a einstream
akzeptiertint
und dann entscheidet, wie das inchar
s konvertiert wird , und umgekehrt - es könnte das Big-Endian-Format, das Little-Endian-Format, ein bitumgekehrtes Format, ein 7-Bit-Format verwenden. nur Format oder irgendetwas anderes. dh es abstrahiert das Speicherformat.Mit Hilfe von
streambuf
können wir auf einer noch niedrigeren Ebene arbeiten . Es ermöglicht den Zugriff auf die zugrunde liegenden Puffer.Hier einige gute Beispiele: Kopieren, Laden, Umleiten und Abschlagen mit C ++ - Streambufs und in Bezug auf den Vergleich: Dies kann hilfreich sein.
Weitere Informationen finden Sie hier: IOstream-Bibliothek
quelle