ITEEDU

自测练习

14.1 填空:

a) 计算机处理的所有数据项最终都是——和——的组合。

b) 计算机所能处理的最小数据项称为——。

c) 一个——是一组相关的记录。

d) 数字、字母和专门的符号称为——。

e) 一组相关的文件称为——。

f) fstream、ifstream和ofstream文件流类的成员函数——关闭文件。

g) istream成员函数——从指定流中读取一个字符。

h) istream成员函数——和——从指定流中读取一行数据。

i) fstream,ifstream和ofstream文件流类成员函数——打开一个文件。

j) 以随机访问方式读取文件中的数据通常使用istream成员函数——。

k) istresm和ostrcam类成员函数——、——把文件位置指针重定位到输入流与输出流中指定的位置。

14.2 判断下列说法是否正确。如果不正确,请说明原因。

a) 函数read不能从标准输入流对象cin读取数据。

b) 程序员必须显式地生成cin、cout、Cerr和clog对象。

c) 程序必须明确地调用函数close关闭与fstream、ifstream和ofstream对象相关的文件。

d) 如果文件位置指针没有指向顺序访问文件的起始位置,要从文件起始位置读取数据必须关闭文件然后再打开它。

e) ostream成员函数write能够把数据写入标准输出流cout。

f) 更新顺序访问文件中的数据一般不会重定义其他数据。

g) 查找随机访问文件中的指定记录不必从头逐条查找。

h) 随机访问文件中的记录必须有统一的长度。

i) 函数seekp和seekg只能定位相对于文件起始点的位置。

14.3 用一条语句分别完成下列要求。假定每一条语句用于同一个程序。

a) 编写一条语句,打开以便输人数据的文件oldmast.dat,用ifstream对象inOldMaster。

b) 编写一条语句,打开以便输入数据的文件trans.dat,用ifstream对象Transaction。

c) 编写一条语句,打开以便输出(以及建立)数据的文件newmast.dat,用ofstream对象outNewMaster。

d) 编写一条语句,读取文件oldMast.dat中的一条记录。记录是由整数accountNum、字符串name和浮点数currntBalance组成的,用ifstream对象inOldMaster。

e) 编写一条语句,读取文件trans.dat中的一条记录。记录是由整数accountNum和浮点数dollarAmount组成的,用ifstream对象inTransaction。

f) 编写一条语句,向文件newmast.dat中写入一条记录。记录是由整数aecoumNum、字符串name和浮点数currentBalance组成的,用ofstream对象outNewMaster。

14.4 指出下列程序段中的错误,并说明如何纠正。

a) 没有打开ofstream对象outPayable所引用的文件(payables.dat)。

outPayable <<account<<company<<amount<<endl;

b) 下面一条语句要从文件payables.dat中读取一条记录。ifstream对象inPayable引用该文件,istream对象inReceivable引用文件receivables.dat。

inReceivable >>account>>company>>amount;

c) 打开文件tools.dat,在不删除当前数据的情况下把数据添加到文件中。

ofstream outTools( "tools.dat",ios::out);

自测练习答案

14.1 a) 1、0。 b)位。 c)文件。d)字符。e) 数据库。f)close。g) get。h)get、getline。i)open。

j)read k) seekg、seekp。

14.2 a) 不正确。函数read可以从istream派生的任何输入流对象读取。

b) 不正确。这4个流自动生成。应在文件中包括 <iostream.h>头文件,该文件首部包含了对这4个流对象的声明。

c) 不正确。流对象离开范围或程序执行终止前执行ifstream、ofstream和fstream对象的析构函数时关闭文件,但作为一个编程技巧,应在文件不再需要时立即用close关闭。

d) 不正确。成员函数seekp或seekg可以将put或get文件位置指针移到文件开头。

e) 正确。

f) 不正确。大多数情况下,顺序文件的记录没有统一的长度。因此,更新一条记录可能会重定义其他数据。

g) 正确。

h) 不正确。随机访问文件中的记录通常具有统一的长度。

i) 不正确。根据文件位置指针从文件起始点、结束点和当前点定位文件中的位置都是可能的。

14.3 a) ifstream inOldMaster( "oldmast.dat", ios::in);

b) ifstream inTransaction( "trans.dat", ios::in );

c) ofstream outNewMaster( "newmast.dat", ios::out );

d) inOldMaster >> accountNum >> name >> currentBalance;

e) inTransaction >> accountNum >> dollarAmount;

f) outNewMaster << accountNum << name << currentBalance;

14.4 a) 不正确:文件"payables.dat"没打开就试图向流输出数据。

纠正:用ostream函数open打开 "payables.dat"以便输出。

b) 不正确:用不正确的istream对象从文件 "payables.dat"读取记录。

纠正:用istream对象inPayable引用 "payables.dat"。

c) 不正确:删除了文件内容,因为文件打开便会输出(ios::out)。

纠正:可以使用打开文件以便更新(ios::ate)或打开文件以便添加(ios::app)的方法将数据添加到文件中。

练 习

14.5填空:

a) 计算机把大量的数据存储在二级存储设备(如——)上。

b) 一条——是由几个域组成的。

c) 可以包含数字、字母和空格的域称为——域。

d) 为了便于检索文件中的某条指定的记录,每条记录都有一个域被选作——。

e) 计算机系统的大多数信息存储在——文件中。

f) 表达了一定意义的一组相关的字符称为——。

g) 头文件 <iostream.h>声明的标准流对象为——、——、——和——。

h) ostream成员函数——向流中写人一个字符。

i) ostream成员函数——通常用来向随机访问文件中写入数据。

j) istream成员函数——把文件位置指针重定位。

14.6 判断下列说法是否正确。如果不正确,请说明原因。

a) 从本质上说,计算机执行的是对0和1的操作。

b) 人们更愿意对位进行操作,而不愿意操作字符或域,原因是位更紧凑一些。

c) 人们把程序和数据项表示成字符.然后计算机把这些字符作为0和1的组合进行操作和处理。

d) 5位邮政编码是数值域的一个例子。

e) 在计算机应用程序中,一个人所住的街道地址通常被看作是由字母组成的域。

f) 计算机处理的数据项构成了数据的层次。在这个层次结构中,数据项按域、字符和位的顺序是越来越大.越来越复杂。

g) 记录关键字属于某个特定的域,它能够识别一条记录。

h)为了便于计算机处理信息,多数机构都把他们的信息存储在一个文件中。

i) C++程序总是通过名字来引用文件。

j) 程序建立一个文件后,计算机会自动保存这个文件以便将来引用。

14.7 练习14.3让读者编写了一组语句,实际上这些语句正好组成一类重要的文件处理程序(即文件匹配程序)的核心。在商业数据处理中,通常在每个系统中都有多个文件。例如,在应收账目系统中,一般有一个主文件,它包含了每个顾客的详细信息,如姓名、地址、电话号码、未付的欠款、信用额度、台同管理,还可能有近期购买和现金付款的简单记录。

事务发生时(即货物卖出、款额邮到),这些信息被输入到一个文件中。每个商业周期(有的公司是一个月,有的是一个星期,还有的是一天)结束时.这个事务文件(在练习14.3中称为"trans.dat")用于主文件(在练习14.3中称为"oldmast.dat")更新账户的购买和付款记录。每更新一次后,主文件就被重写成一个新文件("oldmast.dat"),它用 于在下一个商业周期快结束时执行更新过程。

文件匹配程序必须处理一些单文件程序中不存在的问题。例如,并非总是发生匹配,主文件名某位顾客可能没有在目前的商业周期中购货或付款,这样在事务文件中就没有这个顾客的记录。类似地,某位购货或付款的客户可能剐搬到这个社区来,公司可能来不及为这个顾客建立记录。

以练习14.3中的语句为基础.编写一个完整的文件匹配应收账目程序。为了进行匹配,可以用每个文件上的账号作为记录关键字。假设每个文件都是顺序文件,记录是按账号递增的顺序存储的。

当发生匹配时(即具有相同账号的记录在主文件和事务文件中同时出现),把事务文件上的美元数加到主文件的当前结算额上,并把记录写入newmast.dat中(假定购货在事务文件中用正数表示,付款在文件中用负数表示)。当某个特定的账户只有主记录但没有对应的事务记录时,只把主记录写入newmast.dat中。当只有事务记录而没有对应的主记录时,打印出消息 "Unmastched transaction record for account number"(在省略号处填入事务记录的账号)。

14.8 编写好练习14.7中的程序后,编写一个简单的程序建立一组检验数据,测试练习14.7中的程序,使用如下的范例数据:

———————————————————————————
    主文件:
    账号               姓名            结算额
    100               Alan Jones        348.17
    300               Mary Smith         27.19
    500               Sam Sharp           0.00
    700               Suzy Green        -14.22
———————————————————————————

———————————————
    账号           交易额
    1oo            27.14
    300            62.11
    400           100.56
    900            82.17
———————————————

14.9 用练习14.8中建立的检验数据文件运行练习14.7中的程序,用第14.7节的程序打印一个新的主文件,仔细检查结果。

14.10 有时(很常见)几个事务记录的记录关键字相同,这是因为一个顾客在同一个商业周期内可能多次购货或付款。重写练习14.7中的应收账户文件匹配程序,使它能够处理具有相同关键字的多个事务记录。修改练习14.8中的检验数据,使它包含以下的事务记录:

 ————————————————
    帐号             美元数
  ————————————————
    300              83.89
    700              80.78
    700               1.53
  ————————————————

14.11 写出完成如下要求的语句。假定已经定义了下面的结构并打开了用于写入数据的随机访问文件。

struct person{
    char lastName[15];
    char firstName[15];
    char age[2];
    };

a) 初始化文件nameage.dat,使它拥有100个lastName= "unsigned"、firstName=""、age="0"的记录。

b) 输入10个姓、名和年龄,并将它们写入文件。

c) 更新已有信息的文件.如果没有信息则告诉用户 "No info"。

d) 删除一条己有信息的记录(可以重新初始化这条记录)。

14.12 你是一家五金商店的店主。为了查看工具种类、工具数量以及每件工具的价格,你需要编制一份商品目录。编写一个程序,把文件"hardware.dat"初始化为100条空记录,输入每件工具的有关数据,能够列出所有工具的清单、删除某个工具不存在的记录以及更新文件中的任何信息。用工具标识号作为记录号,在文件中使用下列信息:

————————————————————————————
    记录号        工具名            数量           价格
  ————————————————————————————
    3             Electric sander    7             57.98
    17            Hammer             76            11.99
    24            jig saw            21            11.00
    39            Lawn mower         3             79.50
    56            Power saw          18            99.99
    68            Screwdriver        106           6.99
    77            Sledge hammer      11            21.50
    83            Wrench             34            7.50
  ————————————————————————————
  

14.13 修改第4章编写的电话号码字产生程序,使其将输出写入一个文件,这样就可以方便地阅读文件。如果你有计算机化字典,则可以将程序修改成查找字典中的七字母单词。这个程序产生一些有趣的七字母单词组合,该组合可能包括两个或三个单词。例如,电话号码8432677产生"THEBOSS"。将程序修改成用计算机化字典查找字典中的七字母单词,看看是否有一个字母的单词加六个字母的单词、两个字母的单词加五个字母的单词等等。

14. 14 编写一个程序,用sizeof运算符确定自己的计算机系统中各种数据类型占用的字节数。为便于以后打印,把结果写入文件"datasize.dat"中。文件中的信息格式为:

charData type                size
unsigned char                   1
short int                       2
unsigned short int              2
int                             4
unsigned int                    4
long int                        4
unsigned long int               4
float                           4
double                          8
long double                    16
注意:读者计算机系统中的数据类型大小可能与上面列出的不一样。