C++ C++;Stringstream-使用rd_buf更改常量对象进行复制
给定一个stringstream对象,我想将其复制到另一个。根据: (除其他外),正确的方法是使用C++ C++;Stringstream-使用rd_buf更改常量对象进行复制,c++,stream,constants,stringstream,C++,Stream,Constants,Stringstream,给定一个stringstream对象,我想将其复制到另一个。根据: (除其他外),正确的方法是使用rdbuf()成员。然而,这似乎会引起问题,特别是当stringstream是const时 例如: void DoSomething(stringstream & ss) { stringstream sstmp; cout << "pos 1: " << ss.tellg() << "\n"; sstmp << s
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;
}
对DoSomething()
的第一次调用更改了内部指针,即使stringstream
是const(此处省略,因为偶数tellg()
不是const)。解决这一问题的方法是使用seekg()
,但不能在常量流上调用它。我尝试了另一种方法(在代码中注释掉),但没有成功
那么,可以对以下两种情况做些什么:
stringstream
,而不进行实际更改,或注意:在ArchLinux上使用GCC4.8.1编译,最简单的方法是只制作字符串并以这种方式复制:
sstmp.str(ss.str())代码>
不太明显的方法是充分利用这样一个事实,即您可以从const stringstream获得对rdbuf
的非常量访问
我做了一些更改,以便编译您的代码,并更新代码以直接设置rdbuf
的位置,但它应该做您想要的,现在输出:
String: Hello
String: Hello
-
#包括
#包括
无效剂量测定(常数标准::stringstream和ss)
{
std::stringstream sstmp;
sstmp pubseekpos(0,标准::ios_基::in);
std::cout丢失tellg()
调用并添加对ss.rdbuf()->pubseekoff的调用(0,std::ios_base::beg,std::ios_base::in);
可能会得到你想要的,但我不确定这会让我明白什么是真正的问题;为什么。必须有对流库有更深入了解的人介入。问题很好,而且+1做了预期答案的初始作业。是的,我现在看到了我的打字错误。我很接近:)谢谢你的确认
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;
}