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