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<<
und operator>>
Ü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 haben num_get
. Sie können auch erwarten, dass die Überladungen von Streams operator<<
und operator>>
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ür basic_streambuf<char16_t>
Verwendungen char16_t
und damit basic_streambuf<char16_t>
intern codecvt<char16_t, char, mbstate_t>
standardmäßig verwendet, um die char16_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 dient basic_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.