1.stringstream简介
C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。
(1)istringstream类用于执行C++风格的串流的输入操作。
(2)ostringstream类用于执行C风格的串流的输出操作。
(3)strstream类同时可以支持C风格的串流的输入输出操作。
istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和stringstreambase派生而来,stringstream则是从iostream类和stringstreambase派生而来。
他们的继承关系如下图所示:
2.stringstream用于字符串分割
我之前写了一篇C++中将string按照空白字符分割的新方法中就是用到stringstream来对字符串分割的,这里介绍一种更常见的方法。
例如将字符串“123.12.3.2.1.2”按照“.”进行分割,得到分割后的整数。代码如下:
/**************************************************************
Copyright:武汉大学计算机学院B507
Author: Ryan
Date:2015-10-20
Description:按照给定模式切割字符串
**************************************************************/
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
/*
* Summary: 按照给定的模式切割字符串
* Parameters:
* s:给定的字符串
* pattern:模式
* Return: 存储切割后字符串的vector<int>
*/
vector<int> convert(string& s,string pattern){
stringstream ss;
vector<int> res;
s+=".";
int j;
int size=s.size();
for(int i=0;i<size;i++){
//这行代码非常总要,解决复用问题
ss.clear();
j = s.find(pattern,i);
string sub = s.substr(i,j-i);
//清空缓冲区
ss.str("");
ss.str(sub);
int num;
ss >> num;
res.push_back(num);
i=j+pattern.size()-1;
}
return res;
}
int main(){
string s="123.12.3.2.1.2";
string p = ".";
vector<int> res = convert(s,p);
cout<<"["<<" ";
for(int i=0;i<res.size();i++){
cout<<res[i]<<" ";
}
cout<<"]"<<endl;
return 0;
}
运行结果如下图所示:
如果去掉代码中的ss.clear();这一行,运行结果如下:
在多次用到stringstream的同一对象时,一定要进行clear()操作,避免复用。
3.stringstream用于数据类型转换
(1)string类型转换成int类型(double类型也同样适合)
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string s="123";
int res;
//用s初始化字符串流对象ss
stringstream ss(s);
ss>>res;
cout<<"res:"<<res<<endl;
return 0;
}
运行结果如下:
代码中也可以先定义一个流对象,然后将s输入到流对象中,
stringstream ss;
ss << s;
等同于上面代码中的
stringstream ss(s);
(2)int类型转string类型
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
int a = 123;
string res;
//切记这里不能用a来初始化ss,因为a是int类型的
stringstream ss;
ss<<a;
ss>>res;
cout<<"res:"<<res<<endl;
return 0;
}
运行结果:
4.总结
stringstream能很方便地用于数据类型转换和字符串分割,但是使用过程中一定要注意一些问题,比如clear()方法解决复用问题,.str(“”)清空缓冲区之类的。