使用rd_buf复制C++字符串会更改const对象



给定一个字符串流对象,我想将其复制到另一个。根据:

如何在C++中从一个字符串流对象复制到另一个?

(以及其他),正确的方法是使用rdbuf()成员。然而,这似乎会引起问题,尤其是在字符串流为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流上调用。我尝试了另一种方法(在代码中注释掉),但没有成功。

那么可以对两者做些什么:

  1. 复制(const)stringstream而不真正更改它或

  2. 重置常量对象上的位置?

注意:在Arch Linux 上使用gcc 4.8.1编译

简单的方法是只生成字符串并以这种方式复制:sstmp.str(ss.str());

不太明显的方法是充分利用这样一个事实,即您可以从常量字符串流获得对rdbuf的非常量访问。

我做了一些更改,以便编译您的代码,并更新代码以直接设置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;
}

相关内容

  • 没有找到相关文章

最新更新