如何将ostringstream直接写入cout

Posted

技术标签:

【中文标题】如何将ostringstream直接写入cout【英文标题】:how to write ostringstream directly to cout 【发布时间】:2013-03-26 05:18:34 【问题描述】:

如果我有一个名为ossstd::ostringstream 对象,我知道我可以使用std::cout << oss.str() 来打印出字符串。但是执行oss.str() 会导致返回的字符串被复制。有没有办法直接打印底层的streambuf

提前致谢!

【问题讨论】:

【参考方案1】:

如果您使用的是std::ostringstream,则不会。无法从中读取底层缓冲区(因此ostringstream 中的o),因此您必须依靠实现通过str() 为您完成。

但是,如果您使用std::stringstream(注意缺少o),则底层缓冲区是可读的,并且basic_ostream 具有从缓冲区读取的特殊重载:

#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.)

这直接从底层缓冲区复制,没有中间副本。

【讨论】:

谢谢!您的解决方案有效。我还发现这篇文章***.com/questions/10009809/… 使用 ostream 来实现相同的目的。我只是想知道使用 ostream 和 stringstream 有什么区别。哪个性能更好? @WinstonHuang:您必须对其进行分析以找出哪个性能更高。我怀疑它是否更快,而且它肯定比使用std::stringstream 更复杂。 在 gcc 9.1.0 上试过。无论如何std::cout &lt;&lt; ss1.str() 更快。 (stdout 被重定向到 /dev/null)。 coliru.stacked-crooked.com/a/d4ffa641487aa4cf

以上是关于如何将ostringstream直接写入cout的主要内容,如果未能解决你的问题,请参考以下文章

如何清除 std::ostringstream 实例以便可以重用? [复制]

C++文本处理的学习笔记

使用 ostringstream 或 stringstream 将 C++ Int 转换为字符串

如何在 C++11 中将自定义分配器传递给 std::basic_ostringstream?

string流

使用 ostringstream 导致程序崩溃