1.stringstream中clear()和str("")的区别:
要想很好的理解和运用string流, 这两者的区别必须搞清楚:
区别:
clear():清除流的状态标志,(使本不能接受任何数据的流又恢复到能接受数据的状态),但不会清除流中的内容.
str(""):清空流中的数据,相当于无论之前流中的数据是什么,使用str("") 之后,流数据为空,并且将状态固定.如果只用str("")流中的数据被清除,但是流不能再接受任何数据,也就是说,不能重复利用.在程序中,如果我们想重复利用流进行类型转换等操作,就必须用clear()函数清除流的eofit位.使其恢复到可接受数据状态.
看这个例子,
#include<iostream> #include <sstream> using namespace std; int main(int argc,char *argv[]) { stringstream inout; int a=123,b=456; string m,n; inout << a; //插入int数据, 插入后,流的eofbit位固定, 所以流不会再接受数据. inout >> m; //int 类型转换为字符串; //inout.clear(); //inout.str(""); inout << b; //eofbit位固定,不会接受b; inout >> n;//所以n 是空的 cout <<"m:" << m << "n:"<<n<<endl; cout<<inout.str()<<endl; return 0; }
1.运行程序得到:
m:123n: inout.str():123
原因分析:插入int型数据后,流的eofbit位被置位,流不会再接受数据,所以b不会被插入,所以n 是空字符串,inout.str()返回的流inout中的数据,也就只有123了。
2.去掉inout.clear()那行注释运行:
m:123n:456 inout.str():123456
原因分析:插入int型数据后,流的eofbit位被置位,但是input.clear()清除了eofbit位,使流再次处于能接受数据状态,所以b会被插入,所以n 是456串,inout.str()返回的流inout中的数据,只有123456了。
3.再去掉inout.str(" ")运行得到:
m:123n:456 inout.str():456
原因分析:插入int型数据后,流的eofbit位被置位,但是input.clear()清除了eofbit位,使流再次处于能接受数据状态,inout.str("")并清除流中的数据,所以b会被插入,所以n 是456串,inout.str()返回的流inout中的数据,x现在只有456了。
4.注释掉inout.clear()那行运行:
m:123n: inout.str():
原因分析:插入int型数据后,,流的eofbit位被置位,inout.str("")清除了流中的数据123, 但是并没有改变eofbit位,所以b没有被插入,n为空字符串,此时inout.str()返回流中的数据也为空.
2.string流的作用:
(1).把字符串类型转换为其他类型:
#include<iostream> #include <sstream> using namespace std; int main(int argc,char *argv[]) { istringstream recode("12345.4 34"); //从string对象到数值的转换. float b; int c; recode >> b; //以空格为界,把istringstreram中的数据取出,第一个转换为float型. recode >> c; //以空格为界,取出istringstream中的第二个数据 转换为int型. cout << b<<endl; cout << c << endl; return 0; }
(2)把一行字符串放入流中, 单词以空格分开, 之后把一个个单词依次从流中读出来.
#include<iostream> #include <sstream> using namespace std; int main(int argc,char *argv[]) { istringstream in; string line,str1; while(getline(cin,line)){ //从终端接受一行字符串,存入line中 in.str(line); //把line中的字符串存入字符串流中 while(in >> str1){ //每次读取一个单词(以空格为例)存入str1中; cout << str1<<endl; } } return 0; }
(3)把基本类型转换为string类型;
#include<iostream> #include <sstream> using namespace std; int main(int argc,char *argv[]) { int n=9,m=4; string p,q,s; stringstream stream; stream << n; //整数转换为string。 stream >> p; stream.clear(); stream << m; stream >> q; stream.clear(); char str[]="yang"; //把char类型转换为string类型. stream << str; stream >> s; cout << "p:"<<p<<" " <<"q:"<< q<<" "<<"s:"<<s<<endl; return 0; }