1.概述
iostream 标准库支持内存中的输入/输出,只要将流与存储在程序内存中的 string 对象捆绑起来即可。此时,可使用 iostream 输入和输出操作符读写这个 string 对象。
标准库定义了三种类型的字符串流:
istringstream,由 istream 派生而来,提供读 string 的功能。ostringstream,由 ostream 派生而来,提供写 string 的功能。stringstream,由 iostream 派生而来,提供读写 string 的功能。要使用上述类,必须包含
sstream头文件。
与 fstream 类型一样,上述类型由 iostream 类型派生而来,这意味着 iostream 上所有的操作适用于 sstream 中的类型。sstream 类型除了继承的操作外,还各自定义了一个有 string 形参的构造函数,这个构造函数将 string 类型的实参复制给 stringstream 对象。对 stringstream 的读写操作实际上读写的就是该对象中的 string 对象。这些类还定义了名为 str 的成员,用来读取或设置 stringstream 对象所操纵的 string 值。
注意到尽管 fstream 和 sstream 共享相同的基类,但它们没有其他相互关系。特别是,stringstream 对象不使用open 和 close 函数,而 fstream 对象则不允许使用 str。
2.stringstram常用操作
// 创建stringstream对象
stringstream stream;
// 创建以s为副本的stringstream对象
string s = "deardeer.tech";
stringstream stream(s);
// 返回一个string对象,值为当前stringstream对象的内容
stream.str();
// 拷贝s的内容到stream中
stream.str(s);
3.istringstream
istringstream istrm("1 2 3 4 5 6 7 8 9 10");
string word;
while(istrm >> word) {
cout << word << '|';
}
// 运行结果:1|2|3|4|5|6|7|8|9|10|
2.ostringstream
ostringstream ostrm;
// 将10,9,8,7,..,1写入ostringstream
for(int i = 10; i > 0; i--) {
ostrm << i << " ";
}
// 输出ostringstream的内容
for(char c : ostrm.str()) {
cout << c;
}
// 运行结果:10 9 8 7 6 5 4 3 2 1
4.简单应用
a.特殊读入
一般我们可以每次一个单词或每次一行的方式处理输入的程序。第一种程序用 string 输入操作符,而第二种则使用 getline 函数。然而,有些程序需要同时使用这两种方式:有些处理基于每行实现,而其他处理则要操纵每行中每个单词。这时候我们可用 stringstream 对象实现:
string sentence;
// 以行为单位操作
while(getline(cin, sentence)) {
istringstream istrm(sentence);
string word;
while(istrm >> word) {
// 以单词为单位操作
cout << word << "#";
}
}
// 输入:Hello everyone! This is an ostringstream example!
// 输出:Hello#everyone!#This#is#an#ostringstream#example!#
b.格式化读写、转换
int a = 7;
double b = 77.77;
ostringstream ostrm;
// 写入ostringstream
ostrm << "integer: " << a << " float: " << b;
cout << ostrm.str() << endl;
// 此时ostrm内容为:integer: 7 float: 77.77
int c;
double d;
istringstream istrm(ostrm.str());
string ts;
// 从istringstream读出
istrm >> ts >> c >> ts >> d;
cout << c << " " << d << endl;
// 运行结果:
// integer: 7 float: 77.77
// 7 77.77