给定一个stringstream对象,我想将它复制到另一个。根据:
how copy from one stringstream object to another in C++?
(以及其他),正确的方法是使用rdbuf()
成员。但是,这似乎会引起问题,特别是如果stringstream是const。
例如:
void DoSomething(stringstream & ss)
{
stringstream sstmp;
cout << "pos 1: " << ss.tellg() << "\n";
sstmp << ss.rdbuf();
cout << "pos 2: " << ss.tellg() << "\n";
// sstmp.rdbuf()->pubseekpos(0, ios_base::in | ios_base::out);
cout << "String: " << sstmp.str() << "\n";
}
int main(void)
{
stringstream ss;
ss << "Hello";
DoSomething(ss);
DoSomething(ss);
return 0;
}
输出
pos 1: 0
pos 2: 5
String: Hello
pos 1: 5
pos 2: 5
String:
对DoSomething()
的第一次调用改变了内部指针,即使stringstream
是const(在此处省略,因为偶数tellg()
不是const),似乎也会这样做。解决这个问题的方法是seekg()
,但不能在const流上调用。我尝试了另一种方式(在代码中注释掉了)但没有成功。
那么可以做些什么:
复制(const)stringstream
而不更改它,或
重置const对象的位置?
注意:在Arch Linux上使用gcc 4.8.1进行编译
答案 0 :(得分:1)
直截了当的方法就是制作字符串并以这种方式复制:sstmp.str(ss.str());
不太明显的方法是充分利用这样一个事实,即你可以从const字符串流中获得对rdbuf
的非const访问。
我进行了一些更改以便您的代码编译,并更新代码以直接设置rdbuf
的位置,但它应该按照您想要的方式进行,现在输出:
String: Hello
String: Hello
-
#include <sstream>
#include <iostream>
void DoSomething(const std::stringstream& ss)
{
std::stringstream sstmp;
sstmp << ss.rdbuf();
ss.rdbuf()->pubseekpos(0, std::ios_base::in);
std::cout << "String: " << sstmp.str() << "\n";
}
int main()
{
std::stringstream ss;
ss << "Hello";
DoSomething(ss);
DoSomething(ss);
return 0;
}