c++之串流类

定义一个串流类对象,可在头文件中加#include<sstream>,istringstream对象iss可以将字符串中的数据进行分离。其中有一部分转自:http://www.cppblog.com/tommyyan/articles/8023.html

其中:istringstream类用于执行C++风格的串流的输入操作。

ostringstream类用于执行C风格的串流的输出操作。

strstream类同时可以支持C风格的串流的输入输出操作。

一、istringstream类:它是由一个string对象构造而来,可以从一个string中读取字符。它的函数原型是:istringstream::istringstream(string str);

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
void converFromString(const string &s)
{   istringstream iss(s);
    double x;
    while(iss>>x) cout<<x<<endl; 
}
int main()
{   string s="1 15.6";
    converFromString(s);
    return 0;
}

二、ostringstream类是由一个string对象构造而来,它的函数模型是:ostringstream::ostringstream(string str);下面这个代码就直接拷过来了~一个是对作者的尊重,另一个我觉得他比我写的好多了~~呵呵~

//程序作者:管宁  
//站点:www.cndev-lab.com  
//所有稿件均有版权,如要转载,请务必著名出处和作者  
#include <iostream>  
#include <sstream>  
#include <string>  
using namespace std;  
int main()   
{   ostringstream ostr;  
    //ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长 
    ostr.put('d');  
    ostr.put('e');  
    ostr<<"fg";  
    string gstr = ostr.str();  
    cout<<gstr;  
    return 0;
}
/*在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。*/

三、stringstream类:

#include <iostream>  
#include <sstream>  
#include <string>  
using namespace std;    
int main()   
{   stringstream ostr("ccc");  
    ostr.put('d');  
    ostr.put('e');  
    ostr<<"fg";  
    string gstr = ostr.str();  
    cout<<gstr<<endl;  
    char a;  
    ostr>>a;  
    cout<<a;
    return 0;  
}

除此之外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。

#include <iostream>  
#include <sstream>  
#include <string>  
using namespace std;  
int main()   
{  stringstream sstr;  
//--------int转string----------- 
    int a=100;  
    string str;  
    sstr<<a;  
    sstr>>str;  
    cout<<str<<endl;  
//--------string转char[]-------- 
    sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。 
    string name = "colinguan";  
    char cname[200];  
    sstr<<name;  
    sstr>>cname;  
    cout<<cname;  
    return 0;
}

例题1:不指定个数求和

样例输入:

2

20 1 8 4 13 6 10 15 2 17 3 19 7 3 19 7 16 8 11 14 9 12 5

1 -2

样例输出:

Case 1: 20, 200

Case 2: 2, -1

代码:

#include<iostream>
#include<string>
#include<sstream>//字符串流 
using namespace std;
string s;
int main()
{   long sum;
    int i=1,n,m,x;
    cin>>n;
    cin.get();
    while(getline(cin,s))
    {  //istringstream iss(s);//定义一个字符串流对象,可以对字符串s中的数进行数据分离。 
       istringstream cin(s);//这个前面的iss可以自己随意定义。 
       sum=0;m=0;
       while(cin>>x)//从串流类中读取数据 
       {  sum+=x;
          m++;
       }
       cout<<"Case "<<i++<<": "<<m<<", "<<sum<<endl;
    }
    return 0;
}

例题2:NYOJ 525(一道水题),题目已经说了一道水题,用串流类来做的话更显简便,代码:

#include<iostream>
#include<cstring>
#include<sstream>
#include<string>
#include<algorithm>
using namespace std;
const int MAX=5010;
#define CLR(arr,val) memset(arr,val,sizeof(arr))
int x,sum,value[MAX];
string s;
int main()
{   while(cin>>s)
    {   CLR(value,0);
        sum=0;
        for(int i=0;i<s.length();i++)  
            if(s[i]=='5') s[i]=' ';
        istringstream cin(s);    
        while(cin>>x) value[sum++]=x; 
        sort(value,value+sum);
        for(int i=0;i<sum-1;i++)
            cout<<value[i]<<" ";
        cout<<value[sum-1]<<endl;    
    }
    return 0;
}


 


 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值