⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 14章 文件处理.txt

📁 C++大学教程txt版中文版 C++大学教程txt版中文版
💻 TXT
📖 第 1 页 / 共 5 页
字号:
180   }
181   else
182     cerr << "Account #" << account << " is empty." << endl;
183 }
184
185 // output a line of client infomation
186 void outputLine( ostream &output, const clientData &c )
187 {
188   output << setiosflags( ios::left ) << setw( 10 )
189          << c.accountNumber << setw( 16 ) << c.lastName
190          << setw( 11 } << c.firstNeme << setw( 10 )
191          << setprecision( 2 ) << resetiosflags( ios::left )
192          << setiosflags( ios::fixed | ios::showpoint )
193          << c.balance << '\n';
194 }
195
196 // Get an account number from the keyboard
197 int getAccount( const char *prompt )
198 {
199   int account;
2OO
201   do {
202     cout << prompt << " (1 - 1oo): ";
203     cin >> account;
204   } while ( account < 1 || account > 100 );
2O5
206   return account;
207 }

                           图14.15 银行账目程序

14.12 对象的输入/输出
    本章和第11章介绍C++的面向对象式的输入,输出。但我们的例子主要考虑传统数据类型的I/O而不是用户自定义类对象的I/O。第8章介绍了如何用运算符重载输入与输出类对象。我们通过对相应的istream重载流读取运算符>>进行对象输入,通过对相应的ostream重载流插入运算符<<进行对象输出。两种情况下都只输入和输出对象的数据成员,而且都是对特定的抽象数据类型对象有意义的方式进行。对象成员函数在计箅机内部提供,在数据输入时通过重载流插入运算符而与数据值组合。
    对象的数据成员输出到磁盘文件时,就会丢失对象的类型信息。我们存盘的只有数据,而没有类型信息。如果读取这个数据的程序知道其对应的对象类型,则数据读取到该类型的对象。
    如果同一文件中存放不同类型的对象,则会发生有趣的问题,如何在读取到程序中时区分它们(或其数据成员集合)呢?当然,问题在于对象通常没有类型域(见第10章“虚函数和多态性”中的介绍)。
    一个方法是让每个重载的输出运算符输出类型代码,放在表示一个对象的数据成员集合前面。
然后对象输人总是以读取类型代码域开头,并用switch语句调用相应的重载函数。尽管这个方法没有多态编程那么巧妙,但提供了在文件中保持对象并在需要时读取的机制。


小 结
    ●计算机处理的所有数据项最终都是0和1的组合。
    ●可以认为计算机中的最小数据项是0和1,该数据项称为“位”。
    ●数字、字母和专门的符号称为“字符”。能够在特定计算机上用来编写程序和代表数据项的所有字符的集合称为“字符集”。因为计算机只能处理1和0,所以计算机字符集中的每一个字符都是用称为“字节”的8位O、1模式表示的。
    ●一个域就是一组有意义的字符。
    ●记录是一组相关的域。
    ●每个记录中通常至少要选出一个域作为“记录关键字”。记录关键字标识了文件中属于某人或某个实体的记录。
    ●在文件中组织记录的最常用的方法是把记录组织成顺序访问文件。
    ●为建立和管理数据库而设计的程序集合称为“数据库管理系统”(DBMS)。
    ●C++语言把每一个文件都看成一个有序的字节流。
    ●每一个文件根据与机器相关的文件结束符结束。
    ●流提供文件与程序之间的通信通道。
    ●要在C++中进行文件的I/O处理.就要包括头文件<iostream.h>和<fstream.h>。<fstream.h>首部包括流类ifstream、ofstream和fstream的定义。
    ●文件通过建立 ifstream、ofstreara  fstream流类对象而打开。
    ●因为C++把文件看着是无结构的字节流,所以记录等等的说法在C++语言中是不存在的。为此,程序员必须提供满足特定应用程序要求的文件结构。
    ●通过生成ofstream对象打开文件以便输出。向对象传入两个参数——文件名和文件打开方式。
    对于ofstream对象.文件打开方式可取ios::out(将数据输出到文件)或ios::app(将数据添加到文件末尾,而不修改文件中现有的数据)。现有文件用ios::out打开时会截尾,即文件中的所有数据均删除。如果指定文件还不存在,则用该文件名生成这个文件。
    ●用ios运算符成员函数operator!确定打开操作是否成功。如果open操作的流将failbit或badbIt设置,则这个条件返回非0值(true)。
    ●程序可以不处理文件、处理一个文件或处理几个文件。每个文件有惟一的名字,与相应的文件流对象相关联。所有文件处理函数还引用相应对象的文件。
    ●istream类和ostream类都提供成员函数,使程序把“文件位置指针”重新定位。这些成员函数是istream类的seekg(“seek get”)和ostream类的seekp(“seek put”)。每个istream对象有一个get指针,表示文件中下一个输入相距的字节数;每个ostream对象有一个put指针,表示文件中下一个输出相距的字节数。
    ●成员函数tellg和tellp分别返回“get”和“put”指针的当前位置。
    ●实现随机访问文件的简便方法是只用定长记录。这样,程序就可以迅速计算记录相对于文件开头的具体位置。
    ●可以在不破坏其他数据的情况下把数据插入到随机访问文件中。也能在不重写整个文件的情况下更新和删除以前存储的数据。ostream成员函数write把从内存中指定位置开始的固定个数的字节送到指定流中,当流与文件关联时,数据写入到“put”文件位置指针所指示的位置。
    ●istream成员函数read把一定的字节数从指定流输人到内存中指定地址开始的区域。该字节从“get”文件位置指针指定的文件地址开始输入。
    ●write函数要求一个const char*类型的参数为第一个参数,因此我们用强制类型转换运算符将其他类型的地址变为const char *指针。
    ●编译时,一元运算符sizof返回括号中对象的长度(字节数),sizeof返回无符号整数。istream函数read从指定流的当前位置向对象输入指定字节数,read要求第个参数类型为char*。
    ●ios成员函数eof确定是否到达文件末尾,如果读取文件时发生错误,则设置文件结束符。


术 语
alphabeticfield  字母域                           characterfield  字符域
binary digit  二进制数                            chatter set  字符集
bit 位                                            cin(standard input)  标准输人
byte  字节                                        clog(standarderrorbuffeted)  缓冲标准错误流
cerr(standard err unbuffered)  无缓冲标准错误流   close a file  关闭文件
close member function  close成员函数                     开方式
cout(standard output)  标准输出                   ios::noreplace file open mode ios::noreplace 文件
data hierarchy  数据的层次                         打开方式
database  数据库                                  istream class istream 类
database management system(DBMS)  数据库          mumeric field  数字域
  管理系统                                        ostream class orstream 类
decimal digit  十进制数                           open afile  打开文件
end-of-file  文件尾                               open member function   open成员函数
end-of-file marker  文件结束符                    operator! member function  operator!成员函数
ends stream manipulator  ends流操纵算子           operator void * memberfunction operator void*成
         field域                                   员函数
file  文件                                        ostream class   ostream类
file name  文件名                                 output stream  输出流
file position pointer  文件位置指针               random access file 随机访问文件
fstream class   fstream类                         record  记录
fstream.h header file  fstream头文件              record key  记录关键字
ifstream class   ifstream类                       seekg istrem member fuction   seekg istream成
in-core I/O  内核I/O                               员函数
in-memory I/O  内存I/O                            seekp ostream member function seekp ostream成
input stream  输入流                               员函数
ios::app file open mode  ios::app文件打开方式     sequential aecess file  顺序访问文件
ios::ate file open mode  ios::ate文件打开方式     special symbol  特殊符号
ios::beg seek starting point  ios::beg寻找开始点  stream流
ios::cur seek starting point ios::cur寻找开始点   tellg istream member function tellg istream成员
ios::end seek starting point  ios::end寻找开始点    函数
ios::in file open mode  ios::in文件打开方式       tellp ostrem member function  tellp ostream成员
ios::out file open mode  ios::out文件打开方式       函数
ios::trunc file open mode  ios::trunc文件打开方式 truncate an existing file  截尾现有文件
ios::nocreate file open mode   ios::nocreate文件打开方式


自测练习

    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中。当只

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -