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

28

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

我尝试了以下代码:

std::stringstream ss2 = ss1;
或者:
std::stringstream ss2(ss1)

都不起作用。

错误信息如下:

从bsl::basic_stringstream, bsl::allocator>构造bsl::basic_stringstream, bsl::allocator>时,无法访问std::ios::basic_ios(const std::ios&)。

2个回答

44

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

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

#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;
}

输出:

一些123的东西
一些123的东西


这个答案是否比Pedro d'Aquino的答案更高效,因为它似乎更加直接。 - alfC
@alfC:你需要进行性能分析才能确定,但我猜测这种方法可能更有效率,因为它直接从一个缓冲区复制到另一个缓冲区,而不会在中间动态分配字符串。 - GManNickG
现在我向下滚动以查看其他答案中的评论。对于重复的问题,我感到抱歉。 - alfC
5
注意:这不适用于ostringstream / wostringstream,因为rdbuf()是一个读取操作。对于o流,您仍然需要使用str()。 - JustAMartin
实际上这只是一个部分复制。所有格式都丢失了,必须手动复制。 - TrueY
3
这不仅是一份复制,而且根据rdbuf的实现方式,它更像是一次移动。这意味着ss2现在具有数据,但ss1没有了。 - David Feurle

11

因为 std::stringstream 没有提供 复制构造函数,所以您需要从 std::string ss1 构建它的输出:

std::stringstream ss2(ss1.str());

3
我能看到的唯一问题是它强制 ss1 咳出一个字符串,然后再将其重新插入到 ss2 中。而 rdbuf 直接完成这个过程。 - GManNickG
1
同意。我认为这个解决方案不如上面那个有效,因为它需要分配一个字符串和两个副本。 - bhekman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接