C++string流之istringstream,ostringstream,stringstream类介绍

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值