《第8章输入输出流对象课件》由会员分享,可在线阅读,更多相关《第8章输入输出流对象课件(43页珍藏版)》请在金锄头文库上搜索。
1、解析C+面向对象程序设计,第8章 输入/输出流对象,内容提要,8.1 螺旋矩阵的输入输出问题 8.2 流 8.3 无格式输入/输出 8.4 输入/输出的格式控制 (重点) 8.6自定义类型对象的输入输出 8.7 文件的输入/输出问题,第8章输入/输出流对象,2020/8/5,3,提出问题,编程输出M*M的螺旋矩阵,要求数据间距与M相同。例如,4*4的螺旋矩阵,其间距为4: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7,第8章输入/输出流对象,2020/8/5,4,分析问题,C+没有定义任何用于执行输入或输出的语句,但可以使用C语言中的标准I/O函数printf(
2、)和scanf()来解决此问题。,第8章输入/输出流对象,2020/8/5,5,【例8-2】有如下程序: /example8_2.cpp #include int b=20; float a=5.6; int main() printf(%dn,a); scanf(%d, ,该程序的运行结果为: 1610612736 23 45 4349980,第8章输入/输出流对象,2020/8/5,6,printf()与scanf()存在以下两个缺点: 1非类型安全 2不可扩充性,第8章输入/输出流对象,2020/8/5,7,C+使用类型安全(type safe)的I/O流操作。不同类型的I/O流操作都是
3、重载的,没有定义过I/O功能的类型不具备I/O操作的能力。C+标准库既可作为标准数据类型数据的I/O,也能用于自定义类型的对象的I/O,这种扩展性是C+最有价值的特点之一。 C+用输入输出流来解决这个问题。下面先介绍流的概念。,第8章输入/输出流对象,2020/8/5,8,流,在C+程序中,数据可以从键盘流入到程序中,也可以从程序中流向屏幕或磁盘文件。把数据的流动抽象为流。C+的输入输出操作是由流来处理的。,第8章输入/输出流对象,2020/8/5,9,流的概念,所谓流(stream)是指数据从一个位置流向另一个位置。流是字节的序列。,第8章输入/输出流对象,2020/8/5,10,输入输出是
4、一种数据传递操作,可以看作字符序列在计算机内存与外设之间的流动,C+将数据从一个对象到另一个对象的流动抽象为“流”。流动的方向不同,构成输入/输出流,即I/O流。,第8章输入/输出流对象,2020/8/5,11,I/O流,在C+程序中,数据可以从键盘流入到程序,也可以从程序流向屏幕或磁盘文件。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。数据的输入/输出就是通过I/O流来实现的。,第8章输入/输出流对象,2020/8/5,12,I/O流类库的层次结构,C+编译系统提供的I/O流类库含有两个平行基类: streambuf ios ios类有4个直接派生类: 输入流类istr
5、eam 输出流类ostream 文件流类fstreambase 串流类strstreambase,第8章输入/输出流对象,2020/8/5,13,标准输入输出流对象,标准I/O流预定义了4个流类对象:cin、cout、cerr、clog。 操作系统给把外设用文件名的方式进行管理,因此程序设计要访问外设就跟访问文件一样方便。,第8章输入/输出流对象,2020/8/5,14,I/O分为无格式支持的低级I/O和具有格式支持的高级I/O。 无格式支持的低级I/O以基本字节为操作对象,有格式支持的高级I/O把若干字节组合成有意义的单位,如整数、浮点数、字符、字符串及用户自定义类型等等。,第8章输入/输出
6、流对象,2020/8/5,15,无格式输入/输出,无格式输入/输出就是按系统预定义的格式进行的输入/输出。 按默认约定,每个C+程序都能使用标准I/O流,如标准输入、标准输出。 cin用来处理标准输入,即键盘输入;cout用来处理标准输出,即屏幕输出。它们被定义在iostream.h头文件中。 在使用cout和cin前,要用编译预处理命令将所使用的头文件包含到源程序中,其格式如下:,#include ,第8章输入/输出流对象,2020/8/5,16,无格式输出,“”是预定义的插入运算符,作用在流类对象cout上,实现默认格式的屏幕输出。使用cout输出表达式值到屏幕上的格式如下: coutE1
7、E2Em; 其中,E1、E2、Em为均为表达式。功能是计算各表达式的值,并将结果输出到屏幕当前光标位置处。,第8章输入/输出流对象,2020/8/5,17,无格式输出,cout是ostream流类的对象,它在iostream头文件中作为全局对象定义,其格式如下: ostream cout(stdout); 其中,stdout表示标准输出设备名(屏幕)。 在ostream流类中,对应每个基本数据类型定义运算符“”重载函数为友元,它们在ostream中声明: ostream,第8章输入/输出流对象,2020/8/5,18,无格式输入,“”是预定义的提取运算符,作用在流类对象cin上,实现默认格式的
8、键盘输入。使用cin将数据输入到变量的格式如下: cinV1V2Vn; 其中,V1、V2、Vn都是变量。功能是暂停执行程序,等待用户从键盘输入数据,各数据间用空格或Tab键分隔,输入数据类型要与接受变量类型一致,输完后,按回车键结束。,第8章输入/输出流对象,2020/8/5,19,无格式输入,cin是istream流类的对象,它在iostream头文件中作为全局对象定义,其格式如下: istream cin(stdin); 在istream流类,对应每个基本数据类型定义运算符“”重载函数为友元,它们同样也在ostream中声明: istream ,第8章输入/输出流对象,2020/8/5,2
9、0,输入输出的格式控制,C+提供了两种格式化输入/输出方式: 一种是用ios类成员函数进行格式化输入输出 另一种是用专门的操作符函数进行格式化输入输出,第8章输入/输出流对象,2020/8/5,21,用ios类成员函数格式化,ios类成员函数主要是通过对状态标志、输出宽度、填充字符以及输出精度的操作来完成输入/输出格式化。 枚举量定义在ios类中,因此引用时必须包含ios:前缀。使用时应该全部用符号名,绝不要用数值。 例8-3 示例设置状态标志。,第8章输入/输出流对象,2020/8/5,22,用ios成员函数对状态标志进行操作,ios类有3个成员函数可以对状态标志进行操作,并且定义了一个lo
10、ng型数据成员记录当前状态标志。这些状态标志可用位或运算符“|”进行组合。 用 setf函数设置状态标志, 其一般格式如下: long ios:setf(long flags),第8章输入/输出流对象,2020/8/5,23,用ios成员函数对状态标志进行操作,清除状态标志 用unsetf函数清除状态标志,其一般格式如下: long ios:unsetf(long flags),第8章输入/输出流对象,2020/8/5,24,用ios成员函数对状态标志进行操作,用函数flags取状态标志有两种形式,其格式分别如下: long ios:flags() long ios:flags(long fl
11、ag) 例8-4示例对状态标志的操作。,第8章输入/输出流对象,2020/8/5,25,用ios成员函数设置输出宽度,设置输出宽度函数有两种形式,其格式分别如下: int ios:width(int len) int ios:width() 第一种形式是设置输出宽度,并返回原来的输出宽度;第二种形式是返回当前输出宽度,输出宽度为0。,第8章输入/输出流对象,2020/8/5,26,设置填充字符,填充字符的作用是当输出值不满输出宽度时用填充字符来填充,默认填充字符为空格。它与width()函数配合使用,否则没有意义。 设置填充字符函数有两种形式,其格式分别如下: char ios:fill(ch
12、ar ch) char ios:fill() 第一种形式是重新设置填充字符,并返回设置前的填充字符;第二种形式是返回当前的填充字符。,第8章输入/输出流对象,2020/8/5,27,设置输出精度,设置浮点数输出精度有两种形式,其格式分别如下: int ios:precision(int p) int ios:precision() 第一种形式是重新设置输出精度,并返回设置前的输出精度;第二种形式是返回当前的输出精度。,第8章输入/输出流对象,2020/8/5,28,例8-6 示例设置输出宽度、填充字符、输出精度。,第8章输入/输出流对象,2020/8/5,29,用操作符函数格式化,为了不直接以
13、标志位的方式去处理流的状态, c+标准库提供了标准的操作符函数专门操控这些状态。 这组函数不属于任何类成员,定义在iomanip.h头文件中。 将它们用在提取运算符“”或插入运算符“”后面来设定输入/输出格式,即在读写对象之间插入一个修改状态的操作。 其中有些函数没有参数,所以又叫操作符。,第8章输入/输出流对象,2020/8/5,30,设置输入/输出宽度函数setw(int) 设置输出填充字符函数setfill(int) 设置输出精度函数setprecision(int) 设置输入/输出整型数数制函数dec、hex和oct 取消输入结束符函数ws 控制换行操作符endl 代表输出单字符“0”
14、的操作符ends,第8章输入/输出流对象,2020/8/5,31,例8-7用操作符函数示例设置输入/输出宽度。,第8章输入/输出流对象,2020/8/5,32,解决问题,P374-377,第8章输入/输出流对象,2020/8/5,33,提出问题,如何对文本文件和二进制文件进行输入输出操作?,第8章输入/输出流对象,2020/8/5,34,文件的输入/输出,C+把文件看作是一个字符(字节)的序列,即由一个个字符(字节)顺序组成。 根据数据的组织形式,可分为ASCII码文件和二进制文件。 ASCII码文件又称为文本文件,它的每一个字节存放一个ASCII码,代表一个字符。 二进制文件是把内存中的数据
15、按其在内存中的存储形式原样输出到磁盘文件存放。,第8章输入/输出流对象,2020/8/5,35,由于ASCII码形式与字符一一对应,因此便于对字符进行输出或逐个处理,但它要占用较多的存储空间,若存于二进制文件中,可以节省存储空间,但不能直接输出字符形式。,第8章输入/输出流对象,2020/8/5,36,C+有三种文件流类: 输入/输出文件流类fstream 输入文件流类ifstream 输出文件流类ofstream 它们分别从I/O流中的iostream、istream、ostream流类中派生而来。 这些文件流类都定义在fstream.h头文件中,因此,要使用文件流类,必须在程序开始包含该头
16、文件。,第8章输入/输出流对象,2020/8/5,37,C+中进行文件操作的一般步骤,为文件定义一个流类对象; 使用open()函数建立(或打开)文件。如果文件不存在,则建立该文件;如果磁盘上已存在该文件,则打开该文件; 进行读写操作。在建立(或打开)的文件上执行所要求的输入/输出操作。一般来说,在内存与外设的数据传输中,由内存到外设称为输出或写,反之则称为输入或读; 使用close()函数关闭文件。当完成操作后,应把打开的文件关闭,避免误操作。,第8章输入/输出流对象,2020/8/5,38,在C+中,打开一个文件就是将这个文件与一个流建立关联;关闭一个文件就是取消这种关联。 open()函数的原型在fstream.h中定义。另外,在fstream、ifstream和ofstream流类中均有定义。其原型为: void open(char *filename,int mod,int access); 其中第一个参数是用来传递文件名;第二个参数的值