2011-11-14 17 views
55

Próbuję dowiedzieć się nieco więcej o tym, jak działają strumienie I/O w C++, i jestem bardzo zdezorientowany, kiedy użyć czego.Czym dokładnie jest streambuf? Jak tego używać?

Czym dokładnie jest streambuf?
Kiedy używam streambuf, w porównaniu do string, istream lub vector? (Już wiem ostatnich trzech, a nie jak streambuf porównuje się do nich, jeśli nie w ogóle).

+0

To zła abstrakcja bufora strumieniowego. – Pubby

+1

@Pubby: Er, co to jest "bufor strumieni"? Czym różni się od strumienia lub bufora? – Mehrdad

+0

Z tego co rozumiem, strumień formatuje wejście/wyjście i przechowuje je w jego buforze. – Pubby

Odpowiedz

38

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.

+3

To jest 5 lat za późno, więc nie zamierzam opublikować tego jako odpowiedzi i nie przyjmuję tego, ale dla każdego, kto nadal jest zdezorientowany przez terminologię, nawet po przeczytaniu tego: 'streambuf' jest dla ** raw ** dane (np. surowe bajty, surowe int itp.), natomiast 'stream' jest dla ** gotowych ** danych (tekst, liczby całkowite sformatowane jako tekst itp.). Innymi słowy, 'stream' reprezentuje warstwę ** parsowania ** (lub serializacji). W przypadku zwykłych łańcuchów możesz technicznie użyć dowolnego z nich, ale znaczenie jest inne: 'streambuf' oznacza, że ​​chcesz, aby dane surowe były samym ciągiem, podczas gdy' stream' usuwa kodowanie. – Mehrdad

46

Z pomocą streambuf, możemy pracować w jeszcze niższym poziomie. Umożliwia dostęp do podstawowych buforów.

Oto kilka dobrych przykładów: Copy, load, redirect and tee using C++ streambufs oraz w odniesieniu do porównania, może to być pomocne,

enter image description here

Zobacz to więcej szczegółów: IOstream Library

+3

+1 za wskazanie świetnego artykułu. – jweyrich

+1

Szukałem wszędzie czegoś, co mogłoby wyjaśnić zarówno streaguf, jak i ten artykuł. Dzięki za pomoc w odnalezieniu! – wvdschel