我很难从以下代码中理解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
答案 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
将位置设置为流的开头。写入流后或调用适当的搜索方法时,位置会更新。