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)的方法将数据添加到文件中。
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注意:读者计算机系统中的数据类型大小可能与上面列出的不一样。