2011-06-17 12 views
15

Proszę, pomóż mi, abym podkreślił różnicę między "streambuf, stringbuf i stringstream".Proszę mi pomóc zrozumieć różnicę między streambuf, stringbuf i stringstream?

void f1(std::string const& text) 
{ 
    std::stringstream   inStream(text); 
    cout<<inStream.str()<<endl; 
} 

lub jeśli piszę

void f2(std::string const& text) 
{ 
    std::stringbuf   inStream(text); 
    cout<<inStream.str()<<endl; 
} 

Zarówno pokazuje ten sam rezultat. Kiedy powinienem użyć stringbuf lub stringstream? Z góry dziękuję.

Odpowiedz

18

A stringbuf jest używany przez stringstream, zapewnia bufor dla strumienia. A streambuf to tylko podstawowa klasa dla stringbuf. To, czego potrzebujesz, to stringstream, jeśli potrzebujesz sformatowanego wejścia/wyjścia do/wyjścia ze strumienia (jak umieszczenie liczb w łańcuchu), w przeciwnym razie chcesz kontynuować używanie prostego string. Nigdy nie powinieneś samodzielnie zajmować się rodziną streambuf.

+0

masz !! dzięki – Alok

+1

Zrobiłem programy znacznie szybciej przez "kłopotanie się" słowem 'streambuf', więc nie powiedziałbym, że nigdy nie jest użyteczne. – Yay295

1

streambuf jest klasą podstawową zarówno dla stringbuf, jak i stringstream, a stremas ma metody wirtualne, które implementujące klasy mogą przesłonić, aby zapewnić określone implementacje. stringstream jest klasą zawierającą stringbuf i dlatego może mieć nieco inną funkcjonalność niż sama stringbuf.

6

Obiekt std::stringstream zawiera obiekt , który służy jako podstawowy bufor danych, na którym operują operatory strumieniowe. Obiekt stringbuf jest w zasadzie opakowaniem typu string ... tak więc zasadniczo wstawiasz i wyodrębniasz z obiektu typu string za pomocą operatorów >> i << poprzez interfejs stringstream. Obiekt streambuf z drugiej strony jest bazowym buforem pamięci We/Wy używanym do operacji we/wy pliku przy korzystaniu z obiektów stdin, stdout, stderr lub , stderr lub . Jeśli przyjrzysz się standardowym funkcjom wejścia/wyjścia w stylu C, różnica będzie taka, jak musisz dostarczyć bufor pamięci do funkcji takiej jak sprintf do pracy, gdzie - jako fprintf zapisuje do bazowego zarządzanego bufora we/wy. W przypadku języka C++ obiekt stringbuf umożliwia dostęp do podstawowego bufora pamięci dla obiektu stringstream.

2

Dla tych z Was, którzy są z Java:

  • stringbuf => java.nio.ByteBuffer
  • streambuf => java.nio.Buffer (abstrakcyjny, tak samo jak streambuf)
  • stringstream = > java.nio.Channel.newReader (...) + java.nio.Channel.newWriter (...)

byłem supprised tej klasy hierarchii stringbuf, streambuf, stringstream, istringstream, ostringstream, iostream , io_base ... były astonishi Podobnie jak w klasach Java Nio wydanych w latach 2003 ~ 2004 (patrz Jdk 1.4 Nio).

+0

Nie jestem zbyt zaznajomiony z Javą, ale nie jest 'streambuf' bardziej jak' ByteBuffer'? 'streambuf' nie jest abstrakcyjny, iirc i działa bardzo podobnie do bufora bajtowego (char). – jalf

+0

Przeglądając standardową bibliotekę C++, stwierdza się, że streambuf jest abstrakcją, więc nie można bezpośrednio utworzyć instancji. Moje przeprosiny, jeśli jestem zły. Nie mogłem znaleźć żadnego publicznego konstruktora ani metody statycznego inicjatora.Ponadto, gdy widzę metodę przepełnienia i niedomiaru, to powoduje, że myślę, że streambuf nie jest tylko java.nio.Buffer (lub ByteBuffer), ale ma również cechę java.nio.Charset.CharacterEncoder/Decoder. –

+0

ah, dzięki za opracowanie. Prawdopodobnie masz rację :) – jalf

Powiązane problemy