string流(istringstream和ostringstream以及stringstream)


前言

istringstream是从string读取数据,ostringstream是向string写入数据,stringstream是既可以写也可以读,类似于fstream。头文件是sstream


操作描述
sstream strmstrm是一个未绑定的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;
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值