bufory Stream stanowią urządzenia wejściowe lub wyjściowe i zapewnić interfejs niskiego poziomu dla niesformatowanych operacji we/wy dla tego urządzenia. Z drugiej strony strumienie zapewniają wyższą szczelinę wokół bufora za pomocą podstawowych niesformatowanych funkcji wejścia/wyjścia, a zwłaszcza za pośrednictwem sformatowanych funkcji wejścia/wyjścia (to znaczy przeciążeń operator<<
i operator>>
). Obiekty strumieniowe mogą również zarządzać czasem życia bufora strumieniowego.
Na przykład strumień plików ma wewnętrzny bufor plików. Strumień zarządza czasem życia bufora, a bufor zapewnia rzeczywiste możliwości odczytu i zapisu w pliku. Operatory formatowania strumienia ostatecznie uzyskują dostęp do niesformatowanych funkcji wejścia/wyjścia bufora strumieniowego, więc zawsze musisz korzystać z funkcji wejścia/wyjścia strumienia i nie musisz bezpośrednio dotykać funkcji bufora we/wy.
Innym sposobem zrozumienia różnic jest spojrzenie na różne zastosowania obiektów lokalizacji. Strumienie używają aspektów, które mają związek z formatowaniem, takim jak numpunct
i num_get
. Możesz także oczekiwać, że przeciążenia strumieni operator<<
i operator>>
dla niestandardowych typów danych czasu lub pieniędzy będą wykorzystywać aspekty formatowania czasu i pieniędzy. Bufory strumieniowe używają jednak aspektów kodeków, aby konwertować jednostki, których używa ich interfejs, i bajty. Na przykład interfejs dla basic_streambuf<char16_t>
używa char16_t
, a więc basic_streambuf<char16_t>
domyślnie używa domyślnie codecvt<char16_t, char, mbstate_t>
do konwersji sformatowanych jednostek char16_t
zapisanych do bufora na jednostki zapisane na tym urządzeniu. Widać więc, że strumienie służą głównie do formatowania, a bufory strumieniowe zapewniają interfejs niskiego poziomu dla niesformatowanego wejścia lub wyjścia dla urządzeń, które mogą wykorzystywać inne, zewnętrzne kodowanie.
Możesz używać bufora strumieniowego, jeśli chcesz tylko niesformatowany dostęp do urządzenia we/wy. Możesz również użyć buforów strumieniowych, jeśli chcesz skonfigurować wiele strumieni, które współużytkują bufor strumienia (chociaż będziesz musiał dokładnie zarządzać czasem życia bufora). Istnieją również specjalne bufory strumieniowe, których możesz użyć, na przykład wbuffer_convert
w C++ 11, który działa jako fasada dla basic_streambuf<char>
, aby wyglądał jak szeroki bufor strumienia znaków. Używa on aspektu kodeków, który jest zbudowany, zamiast używać aspektu kodeków dołączonego do dowolnego ustawienia narodowego. Zwykle można osiągnąć ten sam efekt, po prostu używając bufora szerokiego strumienia nasyconego locale, który ma odpowiedni aspekt.
To zła abstrakcja bufora strumieniowego. – Pubby
@Pubby: Er, co to jest "bufor strumieni"? Czym różni się od strumienia lub bufora? – Mehrdad
Z tego co rozumiem, strumień formatuje wejście/wyjście i przechowuje je w jego buforze. – Pubby