2

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

如何在 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()更改了内部指针,即使 is const 也似乎这样做了stringstream(此处省略,因为 eventellg()不是 const)。解决这个问题的方法是使用seekg(),但不能在 const 流上调用。我尝试了另一种方式(在代码中注释掉)但没有成功。

那么可以做些什么:

  1. 复制一个 (const)stringstream而没有真正改变它,或者

  2. 重置 const 对象的位置?

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

4

1 回答 1

1

直接的方法是制作字符串并以这种方式复制:sstmp.str(ss.str());

不太明显的方法是充分利用这样一个事实,即您可以从 const 字符串流获得对 的非 const 访问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;
}
于 2013-07-11T18:19:04.277 回答