《c++编程思想第2卷》第四章练习题4-15答案

最近在看c++编程思想第2卷,今天刚刚做完了第4章输入输出流的练习题,觉得第15题有点意思,特写到博文里,以便以后查阅和学习。

题目如下:(意思是解析文件,并按格式输出)

15.    Suppose you are given line-oriented data in a file formatted as follows:
//: C04:Exercise15.txt
Australia
5E56,7667230284,Langler,Tyson,31.2147,0.00042117361
2B97,7586701,Oneill,Zeke,553.429,0.0074673053156065
4D75,7907252710,Nickerson,Kelly,761.612,0.010276276
9F2,6882945012,Hartenbach,Neil,47.9637,0.0006471644
Austria
480F,7187262472,Oneill,Dee,264.012,0.00356226040013
1B65,4754732628,Haney,Kim,7.33843,0.000099015948475
DA1,1954960784,Pascente,Lester,56.5452,0.0007629529
3F18,1839715659,Elsea,Chelsy,801.901,0.010819887645
Belgium
BDF,5993489554,Oneill,Meredith,283.404,0.0038239127
5AC6,6612945602,Parisienne,Biff,557.74,0.0075254727
6AD,6477082,Pennington,Lizanne,31.0807,0.0004193544
4D0E,7861652688,Sisca,Francis,704.751,0.00950906238
Bahamas
37D8,6837424208,Parisienne,Samson,396.104,0.0053445
5E98,6384069,Willis,Pam,90.4257,0.00122009564059246
1462,1288616408,Stover,Hazal,583.939,0.007878970561
5FF3,8028775718,Stromstedt,Bunk,39.8712,0.000537974
1095,3737212,Stover,Denny,3.05387,0.000041205248883
7428,2019381883,Parisienne,Shane,363.272,0.00490155
///:~
 

The heading of each section is a region, and every line under that heading is a seller in that region. Each comma-separated field represents the data about each seller. The first field in a line is the SELLER_ID which unfortunately was written out in hexadecimal format. The second is the PHONE_NUMBER (notice that some are missing area codes). LAST_NAME and FIRST_NAME then follow. TOTAL_SALES is the second to the last column. The last column is the decimal amount of the total sales that the seller represents for the company. You are to format the data on the terminal window so that an executive can easily interpret the trends. Sample output is given below.

                          Australia

              ---------------------------------

 

*Last Name*  *First Name*   *ID*    *Phone*        *Sales*   *Percent*

 

Langler       Tyson          24150   766-723-0284     31.24   4.21E-02

Oneill        Zeke           11159   XXX-758-6701    553.43   7.47E-01

(etc.)


本人实现代码为:

/*
 * 415.cpp
 *
 *  Created on: Aug 14, 2015
 *      Author: zyl
 */
#include <fstream>
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
#include "../require.h"
using namespace std;

class Sales_man {
	size_t id;
	string last_name, first_name;
	string phone;
	double sales;
	double percent;

public:
	enum {NAME_LENGTH = 12, ID_LENGTH = 5, PHONE_LENGTH = 12,
			SALES_LENGTH = 8, PERCENT_LENGTH = 7
		};
	friend ostream& operator<<(ostream& os, const Sales_man& sales_man);
	friend istream& operator>>(istream& is, Sales_man& sales_man);
};

ostream& operator<<(ostream& os, const Sales_man& sales_man) {
	char fillc = os.fill(' ');
	streamsize prec = os.precision();
	os << left << setw(Sales_man::NAME_LENGTH) << sales_man.last_name << " "
	   << setw(Sales_man::NAME_LENGTH) << sales_man.first_name << " "
	   << setw(Sales_man::ID_LENGTH) << sales_man.id << " "
	   << setw(Sales_man::PHONE_LENGTH) << sales_man.phone << " "
	   << right << setw(Sales_man::SALES_LENGTH) << setprecision(2) << sales_man.sales << " "
	   << right << setw(Sales_man::PERCENT_LENGTH) << setprecision(2) << scientific << sales_man.percent
	   << left;
	os.fill(fillc);
	os.precision(prec);
	return os;
}

istream& operator>>(istream& is, Sales_man& sales_man) {
	char comma;
	is >> hex >> sales_man.id;
	is >> comma;
	char phone[255];
	is.get(phone, sizeof(phone), ',');
	// add '-' into phone
	sales_man.phone = phone;
	sales_man.phone.insert(3, "-");
	sales_man.phone.insert(7, "-");
	is >> comma;
	char lastname[255];
	is.get(lastname, sizeof(lastname), ',');
	sales_man.last_name = lastname;
	is >> comma;
	is.get(lastname, sizeof(lastname), ',');
	sales_man.first_name = lastname;
	is >> comma;
	is >> sales_man.sales;
	is >> comma;
	is >> sales_man.percent;
	return is;
}

bool startsWith(const string&line, const string& start) {
	size_t pos = line.find(start);
	if (pos == 0) {
		return true;
	}
	return false;
}

void printTitle(ostream& os) {
	char fillc = os.fill(' ');
	streamsize prec = os.precision();
	os << left << setw(Sales_man::NAME_LENGTH) << "*Last Name*" <<" "
	   << setw(Sales_man::NAME_LENGTH) << "*First Name*" <<" "
	   << setw(Sales_man::ID_LENGTH) << "*ID*"<< " "
	   << setw(Sales_man::PHONE_LENGTH) << "*Phone*" <<" "
	   << right << setw(Sales_man::SALES_LENGTH) << "*Sales*" << " "
	   << right << setw(Sales_man::PERCENT_LENGTH) << "*Percent*" <<" "
	   << left;
	os.fill(fillc);
	os.precision(prec);
}

int main() {
	ifstream ifs("Exercise15.txt");
	assure(ifs);
	string line;
	while (getline(ifs, line)) {
		// jump the comment line
		if (startsWith(line, "//")) {
			continue;
		}

		istringstream is(line);
		size_t pos = line.find(",");
		if (pos == string::npos) {
			//it's country line
			cout << "                    " << line << endl;
			cout << "               --------------------" << endl;
			printTitle(cout);
			cout << endl << endl;
		} else {
			Sales_man man;
			is >> man;
			cout << man << endl;
		}
	}
}




C++编程思想 第二版 第二 中文 本书介绍C++实用的编程技术和最佳的实践方法,深入探究了异常处理方法和异常安全设计;介绍C++的字符串、输入输出流、STL算法、容器和模板的现代用法,包括模板元编程;解释多重继承问题的难点,展示RTTI的实际使用,描述了典型的设计模式及其实现,特别介绍被认为是标准C++下一版特征之一的多线程处理编程技术,并提供了最新的研究成果。本书适合作为高等院校计算机及相关专业的本科生、研究生的教材,也可供从事软件开发的研究人员和科技工作者参考   出版者的话   专家指导委员会   译者序   前言   第一部分 建立稳定的系统   第1章 异常处理    1.1 传统的错误处理    1.2 抛出异常    1.3 捕获异常    1.3.1 try块    1.3.2 异常处理器    1.3.3 终止和恢复    1.4 异常匹配    1.4.1 捕获所有异常    1.4.2 重新抛出异常    1.4.3 不捕获异常    1.5 清理    1.5.1 资源管理    1.5.2 使所有事物都成为对象    1.5.3 auto_ptr    1.5.4 函数级的try块    1.6 标准异常    1.7 异常规格说明    1.7.1 更好的异常规格说明    1.7.2 异常规格说明和继承    1.7.3 什么时候不使用异常规格说明    1.8 异常安全    1.9 在编程中使用异常    1.9.1 什么时候避免异常    1.9.2 异常的典型应用    1.10 使用异常造成的开销    1.11 小结    1.12 练习    第2章 防御性编程    2.1 断言    2.2 一个简单的单元测试框架    2.2.1 自动测试    2.2.2 TestSuite框架    2.2.3 测试套件    2.2.4 测试框架的源代码    2.3 调试技术    2.3.1 用于代码跟踪的宏    2.3.2 跟踪文件    2.3.3 发现内存泄漏    2.4 小结    2.5 练习    第二部分 标准C++库   第3章 深入理解字符串    3.1 字符串的内部是什么    3.2 创建并初始化C++字符串    3.3 对字符串进行操作    3.3.1 追加、插入和连接字符串    3.3.2 替换字符串中的字符    3.3.3 使用非成员重载运算符连接    3.4 字符串的查找    3.4.1 反向查找    3.4.2 查找一组字符第1次或最后一次出现的位置    3.4.3 从字符串中删除字符    3.4.4 字符串的比较    3.4.5 字符串和字符的特性    3.5 字符串的应用    3.6 小结    3.7 练习    第4章 输入输出流    4.1 为什么引入输入输出流    4.2 救助输入输出流    4.2.1 插入符和提取符    4.2.2 通常用法    4.2.3 按行输入    4.3 处理流错误    4.4 文件输入输出流    4.4.1 一个文件处理的例子    4.4.2 打开模式    4.5 输入输出流缓冲    4.6 在输入输出流中定位    4.7 字符串输入输出流    4.7.1 输入字符串流    4.7.2 输出字符串流    4.8 输出流的格式化    4.8.1 格式化标志    4.8.2 格式化域    4.8.3 宽度、填充和精度设置    4.8.4 一个完整的例子    4.9 操纵算子    4.9.1 带参数的操纵算子    4.9.2 创建操纵算子    4.9.3 效用算子    4.10 输入输出流程序举例    4.10.1 维护类库的源代码    4.10.2 检测编译器错误    4.10.3 一个简单的数据记录器    4.11 国际化    4.11.1 宽字符流    4.11.2 区域性字符流    4.12 小结    4.13 练习    第5章 深入理解模板    第6章 通用算法    第7章 通用容器    第三部分 专题   第8章 运行时类型识别    第9章 多重继承    第10章 设计模式    第11章 并发    附录   附录A 推荐读物    附录B 其他    索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值