《C++ Primer》(5th)习题解答——8.13(使用ifstream对象、istringstream对象、ostringstream对象)

题目描述

在这里插入图片描述

代码

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <stdexcept> //标准异常处理类

using std::cin;
using std::cout;
using std::endl;
using std::cerr;
using std::string;
using std::vector;
using std::istream;
using std::ifstream;
using std::istringstream;
using std::ostringstream;

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

string format(const string &s);
bool valid(const string &s);

int main()
{
	string line, word;
	vector<PersonInfo> people;
	ifstream read_file("C:\\Users\\dxm\\Desktop\\info"); 

	while (getline(read_file, line))//按行读入文件
	{
		PersonInfo info;
		istringstream record(line);
		record >> info.name;//读取record中的第一个字符串,即人名
		//读取record中的剩余字符串,即号码
		while (record >> word)
		{
			info.phones.push_back(word);
		}
		people.push_back(info);
	}

	ostringstream os;
	for (const auto &entry : people)
	{
		ostringstream formatted, badNum;
		for (const auto &nums : entry.phones)
		{
			if (!valid(nums))
			{
				badNum << " " << nums;//将错误的号码格式化进badNum对象中
			}
			else
				formatted << " " << format(nums);
		}
		if (badNum.str().empty())
			os << entry.name << " " << formatted.str() << endl;
		else
			cerr << "input error:" << entry.name << " invalid number(s)" << badNum.str() << endl;
	}

	cout << os.str() << endl;
	return 0;
}

//格式化电话号码的函数暂时这样写
string format(const string &s)
{
	return s;
}

//验证电话号码是否合法的函数暂时这样写
bool valid(const string &s)
{
	return true;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值