【足迹C++primer】23、string流

string流

stringstream特有的操作
sstream strm; strm是一个未绑定的stringstream对象。sstream是头文件sstream中定义的一个类型
sstream strm(s); strm是一个sstream对象,保存strings的一个拷贝。此构造函数是explicit的
strm.str() 返回strm所保存的string类型
strm.str(s) 将string的s拷贝到strm中,返回void

使用istringstream

#include<sstream>
#include<iostream>
#include<string>
#include<vector>

using namespace std;

typedef struct PersonInfo
{
    string name;
    vector<string> phones;
};

int main()
{
    string line, word;      //分别保存来自输入的一行和单词
    vector<PersonInfo> people;      //保存来自输入的所有记录

    //逐行从输入读取数据,直到cin遇到文件尾(或其他错误)
    while(getline(cin, line))
    {
        PersonInfo info;        //创建一个保存信息的对象
        istringstream record(line);         //将记录绑定到刚刚读入的行
        record>>info.name;          //读取名字
        while(record>>word)
            info.phones.push_back(word);    //把号码加入进去
        people.push_back(info);     //将记录保存到末尾
    }


    for(vector<PersonInfo>::iterator it=people.begin() ; it != people.end() ; ++it)
    {
        //吧对象取出来
        PersonInfo info=*it;
       cout<<"姓名:"<<info.name<<endl;

       //吧类里面的vector取出来
       vector<string> info2=info.phones;
       cout<<"号码是:";
       for(auto it=info2.begin() ; it != info2.end() ; ++it)
       {
           //取出里面的号码
           string s=*it;
           cout<<" "<<s;
       }
       cout<<endl;
    }

    return 0;
}

使用ostringstream

    for(const auto &entry : people)     //对people中每一项
    {
        ostringstream formatted, badNums;       //每个循环补创建的对象
        for(const auto &nums : entry.phones)    //对每一个电话数
        {
            if(!valid(nums))
            {
                badNums<<" "<<nums;     //将数的字符串形式存入badNums
            }
            else
            {
                //将格式化的字符串“写入”formatted
                formatted<<" "<<format(nums);
            }
        }

        if(badNums.str().empty())
        {
            //如果没有错误的数字
            cout<<entry.name<<" "<<formatted.str()<<endl;   //打印姓名和格式化的数字
        }
        else    //打印名字和错误的数字
        {
            cerr<<" input error: "<<entry.name<<" invalid number(s) "<<badNums.str()<<endl;
        }
    }


这里有一个C++11的新特性,非常好用哦!!!我推荐给大家吧大笑,就是for(auto a : b)这个for循环,可以吧b里面的数据按a的类型一个一个地读取到a中,循环一次就进入到下一个对象上,这种办法你不用担心指针的溢出,不用担心应该吧指针定义的大小规范在哪!!也就不用那些限制条件和什么++i了,方便吧!!


全部代码实现:

/*
* 功能:string流
* 时间:2014年6月8日09:22:25
* 作者:cutter_point
*/

#include<sstream>
#include<iostream>
#include<string>
#include<vector>

using namespace std;

typedef struct PersonInfo
{
    string name;
    vector<string> phones;
};


string format(const string &s) { return s; }

bool valid(const string &)
{
	return true;
}


int main()
{
    string line, word;      //分别保存来自输入的一行和单词
    vector<PersonInfo> people;      //保存来自输入的所有记录

    //逐行从输入读取数据,直到cin遇到文件尾(或其他错误)
    while(getline(cin, line))
    {
        PersonInfo info;        //创建一个保存信息的对象
        istringstream record(line);         //将记录绑定到刚刚读入的行
        record>>info.name;          //读取名字
        while(record>>word)
            info.phones.push_back(word);    //把号码加入进去
        people.push_back(info);     //将记录保存到末尾
    }

    for(const auto &entry : people)     //对people中每一项
    {
        ostringstream formatted, badNums;       //每个循环补创建的对象
        for(const auto &nums : entry.phones)    //对每一个电话数
        {
            if(!valid(nums))
            {
                badNums<<" "<<nums;     //将数的字符串形式存入badNums
            }
            else
            {
                //将格式化的字符串“写入”formatted
                formatted<<" "<<format(nums);
            }
        }

        if(badNums.str().empty())
        {
            //如果没有错误的数字
            cout<<entry.name<<" "<<formatted.str()<<endl;   //打印姓名和格式化的数字
        }
        else    //打印名字和错误的数字
        {
            cerr<<" input error: "<<entry.name<<" invalid number(s) "<<badNums.str()<<endl;
        }
    }



/*
    for(vector<PersonInfo>::iterator it=people.begin() ; it != people.end() ; ++it)
    {
        //吧对象取出来
        PersonInfo info=*it;
       cout<<"姓名:"<<info.name<<endl;

       //吧类里面的vector取出来
       vector<string> info2=info.phones;
       cout<<"号码是:";
       for(auto it=info2.begin() ; it != info2.end() ; ++it)
       {
           //取出里面的号码
           string s=*it;
           cout<<" "<<s;
       }
       cout<<endl;
    }

*/

    return 0;
}


PS:最近感冒真蛋疼!!!各种无力,尼玛实验室还开空调!!!但是又想搞编程,只能硬着头皮上了,如果今天没有好转的态势,我就果断买点药,药不能停啊!!大笑






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值