c程序设计(第二版)第九章流类库与输入输出

上传人:san****019 文档编号:70612268 上传时间:2019-01-17 格式:PPT 页数:79 大小:529.01KB
返回 下载 相关 举报
c程序设计(第二版)第九章流类库与输入输出_第1页
第1页 / 共79页
c程序设计(第二版)第九章流类库与输入输出_第2页
第2页 / 共79页
c程序设计(第二版)第九章流类库与输入输出_第3页
第3页 / 共79页
c程序设计(第二版)第九章流类库与输入输出_第4页
第4页 / 共79页
c程序设计(第二版)第九章流类库与输入输出_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《c程序设计(第二版)第九章流类库与输入输出》由会员分享,可在线阅读,更多相关《c程序设计(第二版)第九章流类库与输入输出(79页珍藏版)》请在金锄头文库上搜索。

1、第九章 流类库和输入/输出,本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。 C+语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C+标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。 流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。,第九章 流类库和输入/输出,9.1 C+的基本流类体系,9.3 标准设备的输入/输出,9.2 输入输出的格式控制(选读),9.4 文件的输入与输出,9.5 字符串流(选读),9.6 文件与对象,9.1 C+

2、的基本流类体系,流类体系:以抽象类模板basic_ios为基类,流类模板派生体系见图9.1。整个流类模板体系的标准I/O在头文件中说明,它包含头文件、和。而输入输出文件流部分在头文件中说明。,图9.1 主要输入/输出流模板层次,9.1 C+的基本流类体系,basic_ios类模板提供了对流进行格式化输入输出和错误处理的成员函数。所有派生都是公有派生。basic_istream类模板提供完成提取(输入)操作的成员函数,而basic_ostream类模板提供完成插入(输出)操作的成员函数。basic_iostream类本质上是前两者的聚合,并没有增加成员。派生全部为公有派生。 有关模板派生请参见教

3、学指导书第8章中“类模板的派生的讨论”,basic_streambuf不是basic_ios的派生类,而是一个独立的类,只是basic_ios有一个保护访问限制的指针指向它。 类basic_streambuf的作用是管理一个流的缓冲区。,流类体系说明:,9.1 C+的基本流类体系,标准输入/输出流对象: 在C+的流类库中定义了四个全局流对象:cin,cout,cerr和clog。可以完成人机交互的功能。 cin标准输入流对象,键盘为其对应的标准设备。 cout标准输出流对象,显示器为标准设备。 cerr和clog标准错误输出流,输出设备是显示器。 其中cin、cout和clog是带缓冲区的,缓

4、冲区由streambuf类对象来管理。而cerr为非缓冲区流,一旦错误发生立即显示。 要使用这四个功能,必须包含文件。,9.1 C+的基本流类体系,重载的提取运算符“”(stream_extraction operator)和插入运算符“”(stream_insertion operator),执行输入/输出操作。 “提取”的含义是指输入操作,可看作从流中提取一个字符序列。 “插入”的含义是指输出操作,可看作向流中插入一个字符序列。 cin使用提取运算符。 cout、cerr和clog使用插入运算符。 文件: 文件处理完成永久保存的功能。 在Windows下不同的C+平台,都为文件功能作了扩充

5、,在VC+的MFC编程中采用了序列化(Serialization)。,提取运算符和插入运算符:,9.2 输入输出的格式控制(选读),enum skipws=0x0001, /跳过输入中的空白字符 left=0x0002, /输出左对齐 right=0x0004, /输出右对齐 internal=0x0008, /在输出符号或数制字符后填充 dec=0x0010, /在输入输出时将数据按十进制处理 oct=0x0020, /在输入输出时将数据按八进制处理 hex=0x0040, /在输入输出时将数据按十六进制处理,格式控制符: C+在类ios_base中提供格式化输入输出。这些格式是对所有文本方

6、式的输入输出流均适用。格式控制符定义为公有的无名枚举类型,在VC+6.0中定义为:,9.2 输入输出的格式控制(选读),showbase=0x0080, /在输出时带有表示数制基的字符 showpoint=0x0100, /输出浮点数时,必定带小数点 uppercase=0x0200, /输出十六进制,用大写 showpos=0x0400, /输出正数时,加”+”号 scientific=0x0800, /科学数方式输出浮点数 fixed=0x1000, /定点数方式输出实数 unitbuf=0x2000, /插入后,立即刷新流 stdio=0x4000 /插入后,立即刷新stdout和std

7、err,对不同的C+平台,枚举常量名相同,但所取值及枚举类型名不一定相同。后文的枚举常量也是如此。为保证通用性,实际只用枚举常量名而不用数值 空白字符包括:空格、制表、垂直制表、换行、换页和回车。,9.2 输入输出的格式控制(选读),该枚举量说明中每一个枚举量实际对应两字节数据(16位)中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为: protected: long x_flags;,点击访问x_flags的重载函数定义,9.2 输入输出的格式控制(选读),输入输出流格式控制标志: p

8、rotected: int x_precision; /标志浮点数精度,默认为6位 int x_width; /输出域宽,默认域宽为0, /重设域宽只对其后第一输出项有效,如域宽不足,则不受限制 char x_fill; /标志域宽有富余时填入的字符,点击访问格式控制标志相关接口函数,【例9.1】整型数输出。,【例9.2】浮点数输出。,9.2 输入输出的格式控制(选读),【例9.2】程序执行后输出: 默认域宽为:0位 默认精度为:6位 默认表达方式:31.4159 科学数表达方式:3.141593e+001 定点表达方式:31.415927 9位科学数表达方式:3.141592654e+001

9、,流操作子(setiosflags stream manipulator): 可代替流格式控制成员函数 点击查阅流操作子 【例9.2_1】采用流操作子的浮点数输出。,9.3 标准设备的输入/输出,本节对cin,cout,cerr和clog,提取和插入运算符(和)的使用的细节作进一步的讨论。,9.3.2 标准输入/输出成员函数(选读),9.3.1 提高标准输入/输出的稳健性,9.3.3 重载插入和提取运算符,状态字state为整型,其的各位在ios中说明: enum ios_state goodbit=0x00, /流正常 eofbit=0x01, /输入流结束忽略后继提取操作;或文件结束已无数

10、据可取 failbit=0x02, /最近的I/O操作失败,流可恢复 badbit=0x04, /最近的I/O操作非法,流可恢复 hardfail=0x08 / I/O出现致命错误,流不可恢复, /VC6.0+和标准C+不支持 ,9.3.1 提高标准输入/输出的稳健性,点击查看读取状态的有关操作,程序运行状态:,对于流,只要出错,对应流的状态标志就设置为1,此后忽略所有对该流对象的操作,必须用clear()函数清0,然后才能正常运行。,9.3.1 提高标准输入/输出的稳健性,标准设备输入使用要点: cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留

11、在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输! 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state(枚举类型io_state)中对应位置位(置1),程序继续。所以要提高稳健性,就必须在编程中加入对状态字state的判断。错误更正后,流的状态字state中对应位不会自动清除,必须软件清0。,9.3.1 提高标准输入/输出的稳健性,3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和

12、字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。 4. 输入数以后再输入字符或字符串:如果数后直接加回车,应该用cin.get()提取回车。如果还有空格,则要清空缓冲区。,【例9.3】提高输入的稳健性。输入时需要故意输错,以测试稳健性。,9.3.2 标准输入/输出成员函数 (选读),输入流成员函数声明: 字符输入: int istream:get(); /提取一个字符,包括空格,制表,垂直制表、换页、 /换行和回车等,与cin有所不同。注意返回为整型。istream /提取一个字符,放在字符型变量中。单参数,并为字符的引用。,9.3.2 标准输入/

13、输出成员函数 (选读),字符串输入: istream 提取的串放在第一个参数为开始地址的存储区中(不查边界);第二个参数为至多提取的字符个数(指定为n,最多取n-1个,再加一个字符串结束符);第三个参数为结束字符,遇此字符则结束,默认为回车换行符。,9.3.2 标准输入/输出成员函数 (选读),字符串输入: 当3参数get()系列函数读到结束字符则停止读入,但不提取结束字符。结束字符要求单独提取(常用回车符,不单独提取回车符,以后会连续读入空串),而且必须使用单参数get()函数或下文的ignore()函数提取结束字符。 getline提取字符串时如遇到指定结束符则提取该结束符,但不保存在串中

14、。这两个函数都会在提取的一系列字符后加一个串结束符,返回值为对象本身(*this)。,如果用VC+标准库函数,即用头文件iostream时,对3参数get()系列函数和getling()函数,当第二个参数为n,而实际输入n个或更多字符,函数未能读到结束字符而停止,流出错(输入输出操作失败),后面不再读入,必须清除流状态字,后面的字符才能继续读入。,9.3.2 标准输入/输出成员函数 (选读),其他函数: 函数gcount()返回最后一次提取的字符数量,包括回车: int istream:gcount(); 函数ignore()读空(指定一个大的数量)缓冲区: istream 第一个参数为要提取

15、的字符数量,默认为1;第二个参数为结束字符,提取该结束字符,但对所提取的字符不保存不处理,作用是空读。第二个参数的默认值EOF为文件结束标志。,在iostream中EOF定义为-1,在int get()函数中,读入输入流结束标志Ctrl+Z(Z)时,函数返回EOF,为了能表示EOF的“-1”值,返回类型为int。采用cin.eof()函数,当前所读为EOF则返回非零,注意函数自身未从流中读取。,【例9.4】 ignore()和gcount()函数使用。,9.3.2 标准输入/输出成员函数 (选读),输出流成员函数声明: ostream /刷新一个输出流,用于cout和clog,9.3.3 重载

16、插入和提取运算符,重载插入和提取运算符: 重载必须保留原来的使用特性。重载只能在用户定义类中,将重载的运算符的函数说明为该类的友元函数: friend istream 函数的返回值是对输入或输出流的引用,这是为了保证在cin和cout中可以连续使用“”或“”和“”或“”的左操作数;第二个参数为用户定义类的引用,作为右操作数。流用作函数参数,必须是引用调用,不能是传值调用。因为这里要求处理流本身,而不是副本。,【例9.5】改进自定义字符串类,重载插入运算符“”。 【例9.6】用户定义的复数类Complex的输入与输出。,9.4 文件的输入与输出,本节中文件指的是磁盘文件。C+根据文件(file)内容的数据格式,可分为两类:二进制文件和文本文件。文本文件由字符序列组成,也称ASCII码文件,在文本文件中存取的最小信息单位为字符(character),而二进

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号