Подтвердить что ты не робот

Различия stringstream и ostringstream

Я тестировал приведенный ниже фрагмент, но он не дает желаемого результата:

#include<iostream>
#include<sstream>
using namespace std;
void MyPrint(ostream& stream)
{
    cout<<stream.rdbuf()<< endl;
}
int main()
{
    stringstream ss;
    ss<<"hello there";
    MyPrint(ss);                //Prints fine

    ostringstream oss;
    oss<<"hello there";
    MyPrint(oss);               //Does not print anything
    getchar();
}

Я знаю, что единственными возможными различиями между stringstream и ostringstream являются то, что позже сила направления и немного быстрее, чем stringstream.

Я что-то пропустил?

PS: аналогичный вопрос был опубликован ранее, но ответа не получил.

4b9b3361

Ответ 1

std::stringstream и std::ostringstream проходят разные флаги std::stringbuf. В частности, std::stringbuf std::ostringstream не поддерживает чтение. И std::cout << stream.rdbuf() - операция чтения на streambuf.

Способ извлечения символов из std::ostringstream равен используя функцию std::ostringstream::str().

Ответ 2

stringstream не следует рассматривать как двунаправленную реализацию ostringstream и istringstream. Он реализован как класс derrive как ostringstream, так и istringstream, поэтому он реализует как входные, так и выходные возможности.

Выбор того, какой из них использовать, зависит от того, для чего он используется. Если вам нужно только записать данные в поток, не имея возможности получить доступ к данным через поток, тогда вам понадобится ostringstream. Однако, если вы хотите реализовать двунаправленную информацию о том, что вы предоставляете API, но ограничите ее, вы можете сделать это:

stringstream ss;  // My bidirectional stream

ostringstream *p_os = &ss;  // Now an output stream to be passed to something only allowed to write to it.

int bytes = collectSomeData(p_oss);