使用stringstream的不同插入位置

时间:2013-10-16 10:58:12

标签: c++ stl stringstream

我很难从以下代码中理解stringstream的不同行为。有人能说明流内部如何运作吗?

int main(){
    string str = "123";  
    stringstream ss(str);
    cout << ss.str() <<endl;  
    ss << str;
    cout << ss.str() <<endl;
} 

输出:

123

123

int main(){
    string str = "123";  
    stringstream ss;
    ss << str;
    cout << ss.str() <<endl;  
    ss << str;
    cout << ss.str() <<endl;
} 

输出:

123

123123

3 个答案:

答案 0 :(得分:5)

这是因为实际的写入位置没有更新,所以当你在第一个例子中做

ss << str;

覆盖当前字符串。

将标志std::ios_base::ate用于字符串流的构造函数

std::stringstream ss(str,
    std::ios_base::in | std::ios_base::out | std::ios_base::ate);

将读/写指针放在最后。

请参阅this reference中的示例。

就像所有流一样,当你打开文件流时,位置也在开始。

答案 1 :(得分:3)

std::stringstream对象在内部记住上一次写作结束的位置。使用<<运算符时会更新此值,但在使用某个字符串构造此流时不会更新:

stringstream ss(str);
cout << ss.tellp() <<endl;  
ss << str;
cout << ss.tellp() <<endl;

输出:

0
3

即。在第一个ss << str;执行时,它只使用“123”来重写“123”,它已经存在。 您可以使用setp 设置插入下一个字符的位置

stringstream ss(str);
cout << ss.str() <<endl;  
ss.seekp(3);                 // <-- sets outPUT position
ss << str;
cout << ss.str() <<endl;

或者您可以设置模式,这将确保在使用std::stringstream::app的每次写操作之前将此位置设置为结束,或者您可以使用std::ios_base::ate来寻找流的结尾打开后立即:

stringstream ss(str, std::stringstream::out | std::stringstream::app);

答案 2 :(得分:0)

构造std::stringstream将位置设置为流的开头。写入流后或调用适当的搜索方法时,位置会更新。