如何在C++中从一个stringstream对象复制到另一个?

sky*_*oor 25 c++ stringstream

我有std::stringstream对象ss1.现在,我想从这个创建另一个副本.

我试试这个:

std::stringstream ss2 = ss1;
Run Code Online (Sandbox Code Playgroud)

要么:

std::stringstream ss2(ss1)
Run Code Online (Sandbox Code Playgroud)

既不起作用

错误消息是这样的:

无法从bsl :: basic_stringstream,bsl :: allocator> :: basic_stringstream(const bsl :: basic_stringstream,bsl :: allocator>&)访问std :: ios :: basic_ios(const std :: ios&).

GMa*_*ckG 38

实际上,流是不可复制的(尽管它们是可移动的).

根据您的使用情况,以下情况非常有效:

#include <iostream>
#include <sstream>

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

    std::stringstream ss2;
    ss2 << ss1.rdbuf(); // copy everything inside ss1's buffer to ss2's buffer

    std::cout << ss1.str() << std::endl;
    std::cout << ss2.str() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

123个东西
有123个东西

  • 注意:这不适用于ostringstream/wostringstream,因为rdbuf()是一个读操作.对于`o`流你仍然需要str(). (4认同)
  • @GManNickG这不仅是一个副本-而是根据rdbuf的实现,是一个举动吗?意味着ss2现在有数据,但ss1没有? (2认同)

Ped*_*ino 8

由于std::stringstream 不提供复制构造函数,您必须从std::string ss1输出构建它:

std::stringstream ss2(ss1.str());
Run Code Online (Sandbox Code Playgroud)

  • 我能看到的唯一问题是它强制`ss1`咳出一个字符串,然后将其重新插入`ss2`.`rdbuf`只是直接做到了. (2认同)