2013-03-26 2 views
9

Если у меня есть объект std::ostringstreamoss, я понимаю, что могу сделать std::cout << oss.str(), чтобы распечатать строку. Но выполнение oss.str() приведет к копированию возвращенной строки. Есть ли способ распечатать непосредственно базовые streambuf?Как написать ostringstream непосредственно cout

Заранее благодарен!

ответ

9

Нет, если вы используете std::ostringstream. Базовый буфер для этого не может быть прочитан (отсюда o в ostringstream), поэтому вам нужно полагаться на реализацию, чтобы сделать это за вас, через str().

Однако, если вы используете std::stringstream (обратите внимание на отсутствие o), то основной буфер для чтения, и basic_ostream «s имеют специальную перегрузку ForReading из буферов:

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::stringstream ss1; 
    ss1 << "some " << 111605 << " stuff" << std::flush; 

    std::cout << ss1.rdbuf() << std::endl; 
    std::cout << ss1.str() << std::endl; 
} 

Выход:

некоторые 111605 вещи
некоторые 111605 вещи

(Example derived from here.)

Это копирует непосредственно из базового буфера без промежуточной копии.

+0

Спасибо! Ваше решение работает. Я также нашел этот пост http://stackoverflow.com/questions/10009809/query-stdostringstream-content/10010160#10010160, где ostream используется для достижения того же. Мне просто интересно, какая разница между использованием ostream и stringstream. какой из них более эффективен? –

+0

@WinstonHuang: Вам нужно профайл, чтобы узнать, что более результативно. Я сомневаюсь, что это все быстрее, но это, безусловно, сложнее, чем просто использование 'std :: stringstream'. – GManNickG

Смежные вопросы