第9章输入输出流类库.ppt
《第9章输入输出流类库.ppt》由会员分享,可在线阅读,更多相关《第9章输入输出流类库.ppt(83页珍藏版)》请在三一办公上搜索。
1、第九章 流类库和输入/输出,本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。当然C+可完成更多的任务。C+语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C+标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。,第九章 流类库和输入/输出,9.1 C+的基本流类体系,9.3 标准设备的输入/输出,9.2 输入输出的格式控制,9.4 文件的输入与输出,9.7 图书馆流通管理系统设计 输出/输入流
2、的应用,9.5 字符串流(内存流),9.6 MFC中的文件处理,9.1 C+的基本流类体系,整个流类体系是一个派生类体系。按ANSI C+标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的基类。VC+中有一个构造函数ios(streambuf*)为公有,与ANSI C+不同。,图9.1 输入/输出流类派生体系,9.1 C+的基本流类体系,图9.2 输入/输出流类层次,streambuf是一个独立的类,只是ios有一个保护访问限制的指针指向它。streambuf的作用是管理一个流的缓冲区。,ios提供了对流进行格式化输入输出和错误处理的成员函数。所有派生都是公
3、有派生。istream类提供完成提取(输入)操作的成员函数,而ostream类提供完成插入(输出)操作的成员函数。iostream类是前两者的组合。,9.1 C+的基本流类体系,在流类库中,最重要的两部分功能为标准输入/输出(standard input/output)和文件处理。在C+的流类库中定义了四个全局流对象:cin,cout,cerr和clog。可以完成人机交互的功能。cin标准输入流对象,键盘为其对应的标准设备。cout标准输出流对象,显示器为标准设备。cerr和clog标准错误输出流,输出设备是显示器。其中cin、cout和clog是带缓冲区的,缓冲区由streambuf类对象来
4、管理。而cerr为非缓冲区流,一旦错误发生立即显示。要使用这四个功能,必须包含文件。,9.1 C+的基本流类体系,提取运算符“”(stream_extraction operator)和插入运算符“”(stream_insertion operator),执行输入/输出操作。“提取”的含义是指输入操作,可看作从流中提取一个字符序列。“插入”的含义是指输出操作,可看作向流中插入一个字符序列。文件处理完成永久保存的功能。在VC+的MFC编程中采用了序列化(Serialization)。,9.2 输入输出的格式控制,enum skipws=0 x0001,/跳过输入中的空白字符 left=0 x00
5、02,/输出左对齐 right=0 x0004,/输出右对齐 internal=0 x0008,/在输出符号或数制字符后填充 dec=0 x0010,/在输入输出时将数据按十进制处理 oct=0 x0020,/在输入输出时将数据按八进制处理 hex=0 x0040,/在输入输出时将数据按十六进制处理 showbase=0 x0080,/在输出时带有表示数制基的字符,C+在类ios中提供格式化输入输出。这些格式是对所有文本方式的输入输出流均适用。格式控制符定义为公有的无名的枚举类型:,9.2 输入输出的格式控制,showpoint=0 x0100,/输出浮点数时,必定带小数点 uppercase
6、=0 x0200,/输出十六进制,用大写 showpos=0 x0400,/输出正数时,加”+”号 scientific=0 x0800,/科学数方式输出浮点数 fixed=0 x1000,/定点数方式输出实数 unitbuf=0 x2000,/插入后,立即刷新流 stdio=0 x4000/插入后,立即刷新stdout和stderr,该枚举量说明中每一个枚举量实际对应两字节数据(16位)中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为:protected:long x_flags;,9
7、.2 输入输出的格式控制,类ios中还设置了三个输入输出流格式控制标志:protected:int x_precision;/标志浮点数精度,缺省为6位 int x_width;/输出域宽,缺省域宽为0,/重设域宽只对其后第一输出项有效,如域宽不足,则不受限制 char x_fill;/标志域宽有富余时填入的字符,点击访问x_flags的重载函数定义,点击访问格式控制标志相关接口函数,【例9.1】整型数输出。,【例9.2】浮点数输出。,9.2 输入输出的格式控制,程序执行后输出:缺省域宽为:0位缺省精度为:6位缺省表达方式:31.4159科学数表达方式:3.141593e+001定点表达方式:
8、31.4159279位科学数表达方式:3.141592654e+001,流操作子(setiosflags stream manipulator)可代替流格式控制成员函数:点击查阅流操作子,9.3 标准设备的输入/输出,标准设备输入是最不安全的,注意以下几点,可以避免错误:1.cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输!,9.3 标准设备的输入/输出,2.输入的数据类
9、型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state(枚举类型io_state)中对应位置位(置1),程序继续。所以要提高健壮性,就必须在编程中加入对状态字state的判断。3.空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。,状态字state为整型,其的各位在ios中说明:enum ios_state goodbit=0 x00,/流正常 eofbit=0 x01,/输入流结束忽略后继提取操作;或文件结束已无数据可取 failbit
10、=0 x02,/最近的I/O操作失败,流可恢复 badbit=0 x04,/最近的I/O操作非法,流可恢复 hardfail=0 x08/I/O出现致命错误,流不可恢复,VC+不支持,9.3 标准设备的输入/输出,点击查看读取状态的有关操作,【例9.3】提高输入的健壮性。输入时需要故意输错,以测试健壮性。,9.3 标准设备的输入/输出,全面介绍输入输出流中的成员函数输入流成员函数声明:字符输入:istream提取一个字符,放在字符型变量中,9.3 标准设备的输入/输出,字符串输入:istream 提取的串放在第一个参数为开始地址的存储区(不查边界);第二个参数为至多提取的字符个数(指定为n,最
11、多取n-1个,再加一个字符串结束符);第三个参数为结束字符,遇此字符则结束,缺省为回车换行符。get系列函数要求单独提取结束字符。getline提取字符串时如遇到指定结束符则提取该结束符,但不保存在串中。这两个函数都会在提取的一系列字符后加一个串结束符,返回值为对象本身(*this)。,9.3 标准设备的输入/输出,返回最后一次提取的字符数量,包括回车的函数gcount():int istream:gcount();读空(指定一个大的数量)缓冲区函数ignore():istream,解释EOF定义和应用,【例9.4】ignore()和gcount()函数使用。,9.3 标准设备的输入/输出,输
12、出流成员函数声明:ostream/刷新一个输出流,用于cout和clog,C+允许用户重载插入和提取运算符“”,,【例9.6】输出字符串地址。,9.4 文件的输入与输出,本节中文件指的是磁盘文件。C+根据文件(file)内容的数据格式,可分为两类:二进制文件和文本文件。文本文件由字符序列组成,也称ASCII码文件,在文本文件中存取的最小信息单位为字符(character),而二进制文件中存取的最小信息单位为字节(Byte)。,9.4.1 文件的打开与关闭,9.4.2 文本文件的读写,9.4.3 二进制文件的读写,9.4.4 文件的随机访问,9.4.5 文件与对象,9.4.1 文件的打开与关闭,
13、文件的使用步骤如下:1说明一个文件流对象,这又被称为内部文件:ifstream ifile;/只输入用ofstream ofile;/只输出用fstream iofile;/既输入又输出用,9.4.1 文件的打开与关闭,2使用文件流对象的成员函数打开一个磁盘文件。这样在文件流对象和磁盘文件名之间建立联系。文件流中说明了三个打开文件的成员函数。void ifstream:open(const char*,int=ios:in,int=filebuf:openprot);void ofstream:open(const char*,int=ios:out,int=filebuf:opernprot
14、);void fstream:open(const char*,int,int=filebuf:openprot);第一个参数为要打开的磁盘文件名。第二个参数为打开方式,有输入(in),输出(out)等,打开方式在ios基类中定义为枚举类型。第三个参数为指定打开文件的保护方式,一般取缺省。所以第二步可如下进行:iofile.open(“myfile.txt”,ios:in|ios:out);,9.4.1 文件的打开与关闭,三个文件流类都重载了一个带缺省参数的构造函数,功能与open函数一样:ifstream:ifstream(const char*,int=ios:in,int=filebuf
15、:openprot);ofstream:ofstream(const char*,int=ios:out,int=filebuf:openprot);fstream:fstream(const char*,int,int=filebuf:operprot);所以1,2两步可合成:fstream iofile(”myfile.txt”,ios:in|ios:out);,9.4.1 文件的打开与关闭,打开文件也应该判断是否成功,若成功,文件流对象值为非零值,不成功为0(NULL),文件流对象值物理上就是指它的地址。因此打开一个文件完整的程序为:fstream iofile(”myfile.txt”
16、,ios:in|ios:out);if(!iofile)cout”不能打开文件:”myfile,txt”endl;exit(1);/失败退回操作系统,9.4.1 文件的打开与关闭,使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写,这在下一节中讨论。关闭文件。三个文件流类各有一个关闭文件的成员函数 void ifstream:close();void ofstream:close();void fstream:close();使用很方便,如:iofile.close();,9.4.1 文件的打开与关闭,关闭文件时,系统把该文件相关联的文件缓冲区中的数据写到文件中,保证文件的完整,收
17、回与该文件相关的内存空间,可供再分配,把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。如又要对文件操作必须重新打开。关闭文件并没有取消文件流对象,该文件流对象又可与其他磁盘文件建立联系。文件流对象在程序结束时,或它的生命期结束时,由析构函数撤消。它同时释放内部分配的预留缓冲区。,9.4.1 文件的打开与关闭,文件打开方式是在ios类中定义的,公有枚举成员:enum open_modein=0 x01,/打开文件用于输入操作(从文件读取),文件指针在文件头out=0 x02,/*打开文件用于写入文件。如文件不存在,则建立,但指定目 录必须存在,否则建立文件失败。如文件存在,未
18、同时设 app,ate,in则文件清空*/ate=0 x04,/打开文件用于输入/输出,文件指针在文件尾,但新数据可写到任何位置app=0 x08,/打开文件用于输出,但从尾部添加,新数据只能添加在尾部trunce=0 x10,/打开文件,并清空它,以建立新文件nocreate=0 x20,/如文件存在则打开,不存在并不创建新文件noreplace=0 x40,/如文件不存在则创建,如文件存在则只能设为ate及app方式binary=0 x80;/以二进制方式打开文件使用方法与格式控制符相同,9.4.2 文本文件的读写,这里讨论文本文件的顺序读写。顺序读写可用C+的提取运算符()和插入运算符(
19、)进行。【例9.7】复制文件。【例9.8】按行复制文本文件。【例9.9】文本式数据文件的创建与读取数据。资源获取是由构造函数实现,而资源释放是由析构函数完成,9.4.3 二进制文件的读写,C+提供了对二进制文件进行读写的成员函数:istream/第一个参数指定输出对象的内存地址,/第二个参数指定插入的字节数,/函数从该地址开始将指定数量的字节插入输入输出流,9.4.3 二进制文件的读写,读函数并不能知道文件是否结束,可用状态函数int ios:eof()来判断文件是否结束。必须指出系统是根据当前操作的实际情况设置状态位,如需根据状态位来判断下一步的操作,必须在一次操作后立即去调取状态位,以判断
20、本次操作是否有效。,【例9.10】创建二进制数据文件,以及数据文件的读取。这两项操作设计为成员函数。给出与【例9.9】不同的读写方式:,使用二进制文件,可以控制字节长度,读写数据时不会出现二义性,可靠性高。同时不知格式是无法读取的,保密性好。文件结束后,系统不会再读(见eofbit的说明),但程序不会自动停下来,所以要判断文件中是否已没有数据。如写完数据后没有关闭文件,直接开始读,则必须把文件定位指针移到文件头。如关闭文件后重新打开,文件定位指针就在文件头。,9.4.4 文件的随机访问,C+把每一个文件都看成一个有序的字节流,见图9.3.每一个文件或者以文件结束符(end of file ma
21、rker)结束,或者在特定的字节号处结束。,当打开一个文件时,该文件就和某个流关联起来了。对文件进行读写实际上受到一个文件定位指针(file position pointer)的控制。输入流的指针也称为读指针,每一次提取操作将从读指针当前所指位置开始,每次提取操作自动将读指针向文件尾移动。输出流指针也称写指针,每一次插入操作将从写指针当前位置开始,每次插入操作自动将写指针向文件尾移动。,9.4.4 文件的随机访问,在C+中可以由程序移动文件指针,从而实现文件的随机访问,即可读写流中任意一段内容。一般文本文件很难准确定位,所以随机访问多用于二进制文件。在ios类中说明了一个公有枚举类型:enum
22、 seek_dirbeg=0,/文件开头cur=1,/文件指针的当前位置end=2/文件结尾;,9.4.4 文件的随机访问,istream类中提供了如下三个成员函数:istream表示将文件定位指针从文件尾向文件头方向移20个字节。tellg()和seekg()往往配合使用。指针不可移到文件头之前或文件尾之后。,9.4.4 文件的随机访问,ostream类也提供了三个成员函数管理文件定位指针,它们是:ostream为了便于记忆,函数名中g是get的缩写,而p是put的缩写。对输入输出文件定位指针只有一个但函数有两组,这两组函数功能完全一样。,【例9.11】使用随机访问对【例9.10】进行改造。
23、,9.4.5 文件与对象,在面向对象的程序设计中,信息总是放在对象的数据成员里。这些信息最终应该保存到文件中。当程序开始运行时,就要由打开的文件重新创建对象。在运行过程中,放在对象的数据成员里的信息得到利用和修改。运行结束时必须把这些信息重新保存到文件中,然后关闭文件。磁盘文件打开时建立的内部文件流是在运行时动态分配的资源。在面向对象的C+程序设计中,文件应该在构造函数中打开,并创建对象;而在析构函数中保存和关闭文件,并撤销对象。这样,与动态安排的其他资源一样,当撤销对象时,能自动释放资源。特别在程序发生异常时,C+系统有异常处理机制,该机制要求动态分配的资源是在类对象中,这样C+保证退出异常
24、点时资源得到完整的释放。对文件而言,释放资源同时包括将对象中的信息再次存入磁盘文件。在程序运行过程中,应该将信息适时保存到相应的磁盘文件中,以免数据意外丢失。,*9.5 字符串流(内存流),可以把流的概念连接到字符串(string)上。串可以看作字符流。可以用输入输出操作来完成串流的操作。串流是与内存相关,所以也称内存流。类包括ostrstream、istrstream、strstream。参见图9.2。串流类对象可以保存字符,也可以保存整数、浮点数。串流类对象采用文本方式。其构造函数常用下面几个:istrstream:istrstream(const char*str);istrstream
25、:istrstream(const char*str,int);ostrstream:ostrstream(char*,int,int=ios:out);其中第二个参数说明数组大小。例:以串流为信息源char ch,str36=”This is a book.n”;istrstream input(str);inputch;/从输入设备(串)读入一个字符coutchendl;/输出T,9.6 MFC中的文件处理,MFC中的文件系统,是广义的文件系统。先讨论MFC的文档/视结构(Document/view),再讨论序列化(Serialization)与永久保存。,9.6.1 文档/视结构,9.6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 输入输出 流类库
链接地址:https://www.31ppt.com/p-4965973.html