- 要使用stringstream,必须包含头文件:
#include <sstream>
- 通过重载的<<和>>运算符可以将文件流中的数据输出到C++字符串中,它们之间的媒介是缓冲区streambuf
- stringstream通常用来做数据转换的,即可向流对象中写,又可读
1.将其他类型的变量转为string类型
一般我们都用str=to_string(x)方法来进行转换,通过stringstream中间做一个转换也可以做到。
stringstream对象(ss)常使用的两个方法
ss.clear():清除流的状态标志,但不会改变流中的内容。
ss.str(""):清空流中的数据,相当于无论之前流中的数据是什么,使用str("")之后,流数据为空,并且将状态符固定。
ss.str() 返回stringsteam中管理的全部string内容
***注意:
对同一个stringstream对象重复赋值时,就需要先对流使用clear()函数清空流的状态,此时流占用的内存没有改变,会一直增加(stringstream不主动释放内存),若想改变内存(一般是清除内存,减少内存消耗),需要再配合使用str("")清空stringstream的缓存。
//test1
#include <iostream>
#include <sstream>
using namespace std;
int main(){
double x=6.6666;
stringstream ss;
string a;
ss<<x;
ss>>a;
cout<<a<<endl;
int y=8000005;
//下次使用ss对象前需先清空
ss.clear();
// ss.str("");
ss<<y;
ss>>a;
cout<<a<<endl;
cout<<ss.str()<<endl;
}
2.通过stringstream对一行字符串指定字符进行分割
这里顺便提一下getline()方法和cin.getline()方法
当我们要读取的字符串包含空格时,常用getline函数进行读取,其函数参数有三个。
getline(istream, string, char)
istream是进行读入操作的输入流
string 存储读入的串的内容
char 终止符,遇到该终止符结束输入。省略时,默认读取一行换行符前面的所有字符(包括换行符,但换行符虽读却不存储,也就是说存储的串中不包含换行符)。cin.getline也可接收三个参数,一个是字符数组首地址,第二个是接受字符个数,第三个是终止符。
例题:
输入:多个测试用例,每个测试用例一行, 数据之间通过','隔开。
54,32,78 8,4,3,6,11,8,1 1 41,20,2
输出
32,54,78 1,3,4,6,8,8,11 1 20,22,41
代码
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
const int N=1000;
int a[N];
int main(){
int sum,cnt;
stringstream ss;
string row,num;
while(getline(cin,row)){
sum=0;
cnt=0;
ss.clear();
ss.str("");
ss<<row;
/*
不清空的话将 stringstream定义成局部变量
stringstream ss(row);
*/
//从stringstream对象中以,为分隔读出数据
//终结符读掉但不存储
while(getline(ss,num,',')){
a[++cnt]=stoi(num);
}
sort(a+1,a+cnt+1);
for(int i=1;i<cnt;i++)
cout<<a[i]<<",";
cout<<a[cnt]<<endl;
}
}