Skip to content

Latest commit

 

History

History
92 lines (47 loc) · 6.26 KB

README.md

File metadata and controls

92 lines (47 loc) · 6.26 KB

第17章 《输入、输出和文件》 编程练习题之我解

17.1

题: 编写一个程序计算输入流中第一个 $ 之前的字符数目,并将 $ 留在输入流中。

17.2

题: 编写一个程序,将键盘输入(直到模拟的文件尾)复制到通过 命令行指定的文件中。

17.3

题: 编写一个程序,将一个文件复制到另一个文件中。让程序通过 命令行获取文件名。如果文件无法打开,程序将指出这一点。

17.4

题: 编写一个程序,它打开两个文本文件进行输入,打开一个文本 文件进行输出。该程序将两个输入文件中对应的行并接起来,并用空格 分隔,然后将结果写入到输出文件中。如果一个文件比另一个短,则将 较长文件中余下的几行直接复制到输出文件中。例如,假设第一个输入 文件的内容如下:

image-20220213140312733

而第二个输入文件的内容如下:

image-20220213140341987

则得到的文件的内容将如下:

image-20220213140425119

17.5

题: Mat和Pat想邀请他们的朋友来参加派对,就像第16章中的编程 练习8那样,但现在他们希望程序使用文件。他们请您编写一个完成下述任务的程序。

  • 从文本文件mat.dat中读取Mat朋友的姓名清单,其中每行为一个朋 友。姓名将被存储在容器,然后按顺序显示出来。
  • 从文本文件pat.dat中读取Pat朋友的姓名清单,其中每行为一个朋 友。姓名将被存储在容器中,然后按顺序显示出来。
  • 合并两个清单,删除重复的条目,并将结果保存在文件matnpat.dat 中,其中每行为一个朋友。

17.6

题: 考虑14章的编程练习5中的类定义。如果还没有完成这个练习, 请现在就做,然后完成下面的任务。

编写一个程序,它使用标准C++ I/O、文件I/O以及14章的编程练习 5中定义的employee、manager、fink和highfink类型的数据。该程序应包 含程序清单17.17中的代码行,即允许用户将新数据添加到文件中。该 程序首次被运行时,将要求用户输入数据,然后显示所有的数据,并将 这些信息保存到一个文件中。当该程序再次被运行时,将首先读取并显 示文件中的数据,然后让用户添加数据,并显示所有的数据。差别之一 是,应通过一个指向employee类型的指针数组来处理数据。这样,指针 可以指向employee对象,也可以指向从employee派生出来的其他三种对 象中的任何一种。使数组较小有助于检查程序,例如,您可能将数组限 定为最多包含10个元素:

image-20220213140612749

为通过键盘输入,程序应使用一个菜单,让用户选择要创建的对象 类型。菜单将使用一个switch,以便使用new来创建指定类型的对象, 并将它的地址赋给pc数组中的一个指针。然后该对象可以使用虚函数 setall( )来提示用户输入相应的数据:

pc[i]->setall(); 

为将数据保存到文件中,应设计一个虚函数 writeall():

for(i=0; i<index; i++)
    pc[i]->writeall(fout);

对于这个练习,应使用文本I/O,而不是二进制I/O(遗憾的是,虚对象包含指向虚函数指针表 的指针,而write( )将把这种信息复制到文件中。使用read( )读取文件的内容,以填充对象时, 函数指针值将为乱码,这将扰乱虚函数的行为)。可使用换行符将字段分隔开,这样在输入 时将很容易识别各个字段。也可以使用二进制I/O,但不能将对象作为一个整体写入,而应该 提供分别对每个类成员应用write( )和read( )的类方法。这样,程序将只把所需的数据保存到文 件中。

比较难处理的部分是使用文件恢复数据。问题在于:程序如何才能 知道接下来要恢复的项目是employee对象、manager对象、fink对象还是 highfink对象?一种方法是,在对象的数据写入文件时,在数据前面加 上一个指示对象类型的整数。这样,在文件输入时,程序便可以读取该 整数,并使用switch语句创建一个适当的对象来接收数据:

image-20220213140825929

然后便可以使用指针调用虚函数getall( )来读取信息:

pc[i++]->getall();

17.7

题: 下面是某个程序的部分代码。该程序将键盘输入读取到一个由 string对象组成的vector中,将字符串内容(而不是string对象)存储到一个文件中,然后该文件的内容复制到另一个由string对象组成的vector 中。

image-20220213140948504

该程序以二进制格式打开文件,并想使用read( )和write( )来完成 I/O。余下的工作如下所述。

  • 编写函数void ShowStr(const string &),它显示一个string对象,并在 显示完后换行。

  • 编写函数符Store,它将字符串信息写入到文件中。Store的构 造函数应接受一个指定 ifstream 对象的参数,而重载的 operator( ) (const string &)应指出要写入到文件中的字符串。一种可行的计划 是,首先将字符串的长度写入到文件中,然后将字符串的内容写入 到文件中。例如,如果len存储了字符串的长度,可以这样做:

    成员函数 data() 返回一个指针,该指针指向一个其中存储了字符串中字符的数组。它类似于成员函数 c_str(),只是后者在数组末尾加上了一个空字符。

  • 编写函数 GetStrs(),它根据文件恢复信息。该函数可以使用 read() 来获得字符串的长度,然后使用一个循环从文件中读取相应数量的字符,并将它们附加到一个原来为空的临时 string 末尾。由于 string 的数据是私有的,因此必须使用 string 类的方法来将数据存储到 string 对象中,而不能直接存储。