今天在OJ上刷题的时候偶然间看到关于stringstream的说明,在网上找到一系列非常好的文章。
对应的章节在<c++ primer>的第八章“标准I/O库”里出现,所以提前一些写这篇文章。
首先我们都知道c++在用cin读取输入的数值时是以空白符(white)作为标记的,那么为了能够读取出一整行的内容,我们使用如下的语句 string s, getline(cin,s);如果这一行里含有大量的空格符,需要转换的话,我们使用stringstream来进行。
首先需要定义头文件#include<sstream>
void convert()
{
string s,buf;
stringstream ss;
getline(cin,s);
ss.str(s); //按照空格进行分割
while(ss>>buf) //又及,可以定义一个无限循环,在if(ss.fail()) break;下也能输出结果
cout<<bufr<<endl;
}
这样就会在每行输出每个单词。
同样的,我们还可以依次来完成不同类型的数值之间的转换。
如以int型向string型来说,在问题求解与分析课上我们用的实际上是类似于进制转换的方式,将余数转化为char型依次赋值给string[i]的每位,但有了sstream后:
void convert2()
{
int a=10987;
string s,buf;
stringstream ss;
ss<<a;
//ss>>buf;
ss>>buf;
for(int i=0;i<buf.size();i++) cout<<buf[i]<<endl;
}
再如string像int型转换:
void convert3()
{
string s,buf;
stringstream ss;
int a,b=100;
s="100";
ss<<s;
ss>>a;
cout<<a+b<<endl;
}
还可以用string向char[]赋值,用strlen()来检验是否赋值成功。
呃,晚上写的时候才发现
关于c++ 第八章里讲的流输出,还有打开文件,只能说太抽象了,本来的话,用ifstream和ofstream就可以了。
有些处理基于每行实现,而其他处理则要操纵每行中每个单词,这时用ss.str(s);
除此之外没有发现什么有用的东西~……