【问题标题】:Redirect from a std::ostringstream to another std::ostringstream从一个 std::ostringstream 重定向到另一个 std::ostringstream
【发布时间】:2014-11-27 15:36:28
【问题描述】:

我需要将一些std::ostringstream 的数据写入另一个std::ostringstream。当然,我可以使用str()函数

std::ostringstream in;
std::ostringstream out;

in << "just a test"; // it's just an example. I mean that stream in is filled somewhere
...
out << in.str();

我想知道是否有更多的直接方法可以做到这一点。

【问题讨论】:

  • 您如何在 ostringstream 上阅读?这不应该是“std::ostringstream in;”吗?成为“std::istringstream in;” ?
  • @Rush - 谢谢。我修正了错字。

标签: c++ std c++03 ostringstream


【解决方案1】:

您可以重新分配关联的缓冲区:

os2.rdbuf(os1.rdbuf());

这有效地为 ostream 起别名。

事实上,你甚至可以直接从流缓冲区指针 IIRC 构造ostream


同样,您可以将整个缓冲区附加到另一个流,而无需重新分配:

std::cout << mystringstream.rdbuf(); // prints the stringstream to console

【讨论】:

    【解决方案2】:

    复制赋值运算符/复制构造函数被删除。但是,您可以使用成员函数swap (C++11) 或std::swap 来交换内容。或者,您可以使用移动赋值运算符 (C++11) 将一个移动到另一个。此解决方案仅适用于您不关心源字符串流的内容的情况。

    例子:

    out = std::move(in); // C++11
    out.swap(in); // C++11
    std::swap(out, in); 
    

    PS:我刚刚意识到 g++ 不编译上述任何行(它似乎不支持 ostringstream 的移动/交换),但是,clang++ 编译它。根据标准(27.8.4),交换/移动应该可以工作。 见C++ compiler does not recognize std::stringstream::swap

    【讨论】:

      猜你喜欢
      • 2015-11-11
      • 2017-05-06
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多