4.13 练习
4-1 有一个由创建的ifstream对象打开的文件。创建一个ostringstream对象,使用其成员函数rdbuf()读该文件全部内容到ostringstream对象中。提取文件基础缓冲区的string拷贝,使用标准C语言头文件<cctype>中定义的宏toupper()将每个字符转换为大写。将结果输出到一个新文件。
4-2 编写程序:打开一个文件(文件名作为命令行的第1个参数),并搜索文件中单词集合中的任意一个单词(作为参数出现在命令行上)。每次读入一行并将匹配的行(连同行号一起)写到一个新文件中。
4-3 编写一个程序:添加“版权声明”到所有源代码文件的开始位置,这些信息通过程序命令行参数指明。
4-4 使用自己喜欢的文本搜索程序(如grep),输出包含一种特殊模式的所有文件的文件名(仅输出文件名)。重新发送输出到一个新文件。编写一个程序,用这个新文件里的内容来产生一个批处理文件,这个批处理文件对每个由文本搜索程序找到的文件,调用自编的编辑器进行编辑。
4-5 我们知道使用setw()可以设置读入字符的最小个数,但是如何设置读入字符的最大数量?编写一个效用算子,使得用户可以指定提取字符数目的最大值。该效用算子也可以进行输出。输出时,这个效用算子可以截短输出域的宽度,如果需要可以保持域宽限制的设置。
4-6 编程演示如下过程:如果失败或致命错误标志位设置后,随后突然产生流异常,流将立即抛出异常。
4-7 由字符串流提供转换很容易实现,不过要付出一定的代价。编写一个程序,实现stringstream转换系统,把这个程序和atoi()比较,以便观察stringstream转换系统最终花费的代价。
4-8 编写一个结构Person,结构的数据域包含名字,年龄,地址等。其中的字符串类型数据成员为固定大小的数组。每条记录的关键字为身份证号码(社会保险编号)。实现下面的类Database:
写一些Person记录到磁盘(不要把这些记录都放在内存中)。当用户需要时,从磁盘中将这些记录读回到内存。DataBase类中的I/O操作使用read()和write()处理所有Person记录。
4-9 为结构Person编写一个插入符operator<<,实现对读入的记录用格式化形式显示。通过将数据输出到文件来演示该插入符的功能。
4-10 假定存储结构Person的数据库丢失了,但前一个练习中产生的输出文件还存在。使用这个文件重新建立数据库。要确保程序中使用错误检查。
4-11 写1000000次size_t(-1)(操作平台规定的最大的无符号整数unsigned int)到一个文本文件。再以二进制格式写1000000次size_t(-1)到一个二进制文件。比较两个文件的大小,看二进制格式的文件能节省多少空间。(读者或许首先想要计算出在自己的操作平台上能节省多少空间。)
4-12 打印一个无理数如sqrt(2.0)时,通过重复增加函数precision()的参数值,观察输入输出流实现的显示该数精度位数的最大个数。
4-13 编写一个程序,从文件中读入一些实数,并且显示(打印)这些实数的和、平均值、最小值和最大值。
4-14 在执行前,猜测下面程序的输出结果:
4-15 假定要从按如下格式存储数据的文件中按行提取数据:
这些数据按地区划分成若干部分,每部分的开头是一个地区名称,下面的每行都是该地区的每一个销售人员的信息。由逗号分隔开的域(字段)代表每个销售人员的相关数据。每行的第1个域是SELLER_ID,遗憾的是,这个域是按十六进制数的格式写的。第2个域是PHONE_NUMBER(注意,有一些域缺少地区编码)。接下来是LAST_NAME和FIRST_NAME。TOTAL_SALES是倒数第2栏。最后一栏是这个销售人员的售货量占公司总售货量的百分比的小数表示。编写程序,在终端窗口用格式化方式显示这些数据,执行结果可以很容易地显示各个销售人员业绩的趋势。输出的样本如下所示: