前言
istringstream是从string读取数据,ostringstream是向string写入数据,stringstream是既可以写也可以读,类似于fstream。头文件是sstream
操作 | 描述 |
---|---|
sstream strm | strm是一个未绑定的stringstream对象,sstream是头文件sstream中定义的一个类型 |
sstream strm(s) | strm是一个sstream对象,保存string s的一个拷贝,此拷贝构造函数时explicit的 |
strm.str() | 返回strm所保存的string的拷贝 |
strm.str(s) | 将string s 拷贝到strm中,返回void |
一、使用 istringstream
当我们的工作时文本处理,以及处理这一行的单词时,通常可以使用istringstream。
废话不多说上代码!//部分代码源自C++Primer
//数据
//jack 12345 2356454
//tom 432455
//lucy 24566 324567 35678
struct PersonInfo{//定义一个数据结构,从输入流中读取信息进行填装
string name;
vector<string> phones;
};
//伪代码,仅示意
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);//读取号码并push
people.push_back(info); //将记录进行保存。
}
或者可以用于一段文字的单词顺序逆序,但是原单词不变
string str;
vector<string> vec;
while (getline(cin,str))
{
vec.clear();
istringstream record(str);
vec.push_back("");
while (record >> vec[vec.size() - 1])
{
vec.push_back("");
}
vec.pop_back();
for (int i = vec.size() - 1; i >= 0; i--)
{
if (i != vec.size() - 1) cout << " ";
cout << vec[i];
}
cout << endl;
}
二、使用 ostringstream
将vector中的信息进行判断并输出。
for(const auto &entry:people){
ostringstream formatted,badNums;
for(const auto &nums: entry.phone)//对每个号码进行处理
{
if(!valid(nums)){
badNums<<" "<<nums;//把数的字符串形式存在badNums
}else{
formatted<<" "<<format(nums)//把格式化的字符串写入formatted中
}
}
if(badNums.str().empty())//没有错误
{
os<<entry.name<<" "<<formatted.str()<<endl;//打印名字和格式化的号码
}else{
//存在错误打印提示信息
cerr<<"input error: "<<entry.name
<<" invalid number(S) "<<badNums.str()<<endl;
}
}