ostringstream нарушает cout?

Я хочу вывести содержимое ostringstream в другой поток (например, std::cout). Я знаю, что могу использовать std::ostringstream::str(), но предполагаю, что это накладные расходы на копирование содержимого потока в строку, а затем в другой поток. Я обнаружил, что могу использовать std::ostringstream::rdbuf() (Комментарий, предполагающий, что у него 25 голосов). Но он ломается std::cout, как показано в выходных данных тестовой программы ниже. Я делаю что-то неправильно?

#include <iostream>
#include <sstream>

int main(int argc, char const *argv[])
{
    std::ostringstream ss;
    ss << "some data" << std::endl;
    std::cerr << std::cout << std::endl;
    std::cout << "start" << std::endl;
    std::cout << ss.str();
    std::cout << ss.rdbuf();
    std::cout << "end" << std::endl;
    std::cerr << std::cout  << std::endl;
    return 0;
}

Результаты в:

0x6013b8
start
some data
0

person Yuri Vorotilov    schedule 21.05.2013    source источник
comment
Используйте str(), как вы предложили.   -  person Micha Wiedenmann    schedule 21.05.2013


Ответы (1)


Ваша проблема в том, что буфер rdbuf() для ostringstream, как и следовало ожидать из названия, только для записи (ostringstream возвращает строку через метод str()). Вы не можете прочитать данные обратно через указатель буфера.

Измените свой ostringstream на stringstream, и он должен работать нормально.

person Mark B    schedule 21.05.2013