string流可以向string类对象写入数据,也可以向string类对象读取数据。string流对象定义在sstream头文件中,其中的istringstream从string对象读取数据,ostringstream向string对象写入数据,stringstream既可以向string对象写入数据,也可以从string对象读数据。
1)istringstream流
当从设备(如键盘或硬盘文件)读取一行文本时,往往需要对整行文本中的单个单词进行处理,这时可以使用istringstream流对象。比如,需要获取一行文本中的所有单词,并把它存放到一个vector里,为后续的单词处理工作做准备。
vector <string> wds; //保存读取的单词
string line, word;
/*利用getline获取一行文本,如果获取成功(getline函数返回有效的cin),则将整行文本的副本保存到
istringstream对象iss中。然后通过调用输入运算符号>>逐个获取iss中的每一个单词,并把获得的单词
放到vector类型对象wds中。
需要注意的是,在读完line中的所有单词后,会触发文件结束信息,使iss变为无效状态,内层while循环
会结束。*/
while(getline(cin, line)) {
istringstream iss(line); //创建输入string流对象,保存line的一个副本
while(iss >> word) //读取每个单词
wds.push_back(word); //将读取的单词尾插到wds中
}
2)ostringstream流
当需要一次打印不同数据类型的数据时,使用ostreamstream流可以很容易实现。比如,在上面的例子中,在获取所有的单词后,一次性输出每个单词和它们的长度:
ostringstring out; //创建string流对象
for (auto &i : wds) //处理每一个单词
out << i << ":" << i.length() << '\n'; //将数据写入输出流对象中
/*对象out的成员函数str返回存储的string类型数据。注意,ostringstream的另一个版本的成员函数
str接受一个string类型的参数,用来覆盖原有的数据,例如out.str('')调用后,out里面的数据将被
清空*/
cout << out.str(); //打印输出