字符串流的不同插入位置
different insert position with 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
这是因为实际的写入位置没有更新,所以当你在第一个示例中
ss << str;
覆盖当前字符串。
使用字符串流构造函数std::ios_base::ate
std::stringstream ss(str,
std::ios_base::in | std::ios_base::out | std::ios_base::ate);
将读/写指针定位在末尾。
请参阅此参考中的示例。
所有流都是这样,当您打开文件流时,位置也在开头。
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);
构造std::stringstream
会将位置设置为流的开头。位置在写入流或调用适当的查找方法后更新。
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 如何将元素添加到向量的字符串位置
- 在字符串中插入空格
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 在将字符插入 2d 字符串时如何不显示空字符?
- 如何在另一个字符串的x位置插入一个字符串?
- C++代码,用于在用户插入的字符串的每个元音之后插入一对字符
- C++BST树中插入一个字符串
- 从CSV文件读取时,试图将值插入一个字符串中时崩溃
- C++ - 链表插入排序(字符串元素)
- 插入映射<字符串,结构>错误
- 字符串流的不同插入位置
- Boost 如何将流插入直接插入到 C 字符串中
- vector<string> 为空,而已插入某些字符串
- 正在更改起始位置并将字符串插入到字符数组中
- 如何将字符串插入到字符串流的开头
- 实际位置字符串格式
- 如何将数据插入地图<字符串,设置<string>> C++?
- 建议需要插入一个字符串到另一个一旦获得文本从剪贴板
- 将字符串插入到2D向量的指定位置