《面向对象程序设计技术C课件第7章.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计技术C课件第7章.ppt(24页珍藏版)》请在金锄头文库上搜索。
1、第第7章章 I/O流流本章主要内容本章主要内容n n流的概念 n n非格式化输入/输出 n n格式化输入/输出n n文件的输入/输出2面向对象技术与Visual C+-第7章流的概念流的概念 n n在C+中,将数据从一个对象到另一个对象的流动抽象为“流流”。流动的方向不同,构成输入/输出流,即I/O流。n n在C+程序中,数据可以从键盘流入到程序,也可以从程序流向屏幕或磁盘文件。n n从流中获取数据的操作称为从流中获取数据的操作称为提取操作提取操作提取操作提取操作(Get (Get from)from)n n向流中添加数据的操作称为向流中添加数据的操作称为插入操作插入操作插入操作插入操作(Pu
2、t to)(Put to)。n nC+中数据的输入/输出就是通过I/O流来实现的。3面向对象技术与Visual C+-第7章n nC+编译系统提供的I/O流库含有两个平行基类:streambuf和ios,所有的流类都是由它们派生出来的。n nios类有4个直接派生类,即输入流类istream、输出流类ostream、文件流类fstreambase、串流类strstreambase,这4种流作为流库中的基本流类。 4面向对象技术与Visual C+-第7章I/O流库中各个类之间的层次关系流库中各个类之间的层次关系 stdiostreamiosistrstreamistreamifstreamis
3、tream_withassignostreamfstreamostream_withassignstrstreamiostreamofstreamostrstreamstreambufstrstreambuffilebufstdiobuffstreambasestrstreambase5面向对象技术与Visual C+-第7章非格式化输入非格式化输入/输出输出 n n非格式化输入/输出就是按系统预定义的格式进行的输入/输出。n n按默认约定,每个C+程序都能使用标准I/O流,如标准输入、标准输出。n ncincin用来处理标准输入,即键盘输入;用来处理标准输入,即键盘输入;n ncoutcou
4、t用来处理标准输出,即屏幕输出。它们被用来处理标准输出,即屏幕输出。它们被定义在定义在iostream.hiostream.h头文件中。头文件中。n n在使用在使用coutcout和和cincin前,要用编译预处理命令将所前,要用编译预处理命令将所使用的头文件包含到源程序中,其格式如下:使用的头文件包含到源程序中,其格式如下:#include 6面向对象技术与Visual C+-第7章非格式化输出非格式化输出 n n“”是预定义的插入运算符,作用在流类对象cout上,实现默认格式的屏幕输出。使用cout输出表达式值到屏幕上的格式如下:coutE1E2”重载函数为友元,在ostream.h中申明
5、。ostreamostream& operator(& operator(ostream&sostream&s, char*, char*psps); );ostreamostream& operator(& operator”是预定义的提取运算符,作用在流类对象是预定义的提取运算符,作用在流类对象是预定义的提取运算符,作用在流类对象是预定义的提取运算符,作用在流类对象cincin上,实现默认格式的键盘输入。使用上,实现默认格式的键盘输入。使用上,实现默认格式的键盘输入。使用上,实现默认格式的键盘输入。使用cincin将数据输入将数据输入将数据输入将数据输入到变量的格式如下:到变量的格式如下:
6、到变量的格式如下:到变量的格式如下:cincinV1V2V1V2VnVn; (; (自左向右结合)自左向右结合)自左向右结合)自左向右结合) 其中,其中,其中,其中,V1V1、V2V2、VnVn都是变量。功能是暂停执行都是变量。功能是暂停执行都是变量。功能是暂停执行都是变量。功能是暂停执行程序,等待用户从键盘输入数据,各数据间用空格程序,等待用户从键盘输入数据,各数据间用空格程序,等待用户从键盘输入数据,各数据间用空格程序,等待用户从键盘输入数据,各数据间用空格或或或或TabTab键分隔,输入数据类型要与接受变量类型一键分隔,输入数据类型要与接受变量类型一键分隔,输入数据类型要与接受变量类型一
7、键分隔,输入数据类型要与接受变量类型一致,输完后,按回车键结束。致,输完后,按回车键结束。致,输完后,按回车键结束。致,输完后,按回车键结束。n ncincin是是是是istreamistream流类的对象,它在流类的对象,它在流类的对象,它在流类的对象,它在iostream.hiostream.h头文件中头文件中头文件中头文件中作为全局对象定义:作为全局对象定义:作为全局对象定义:作为全局对象定义:istreamistream cin(stdincin(stdin); );标准输入设备名, 由操作系统定义,默认为键盘。9面向对象技术与Visual C+-第7章其中,其中,stdin表示标准输
8、入设备名(键盘)。表示标准输入设备名(键盘)。在在istream流类,对应每个基本数据类型定义流类,对应每个基本数据类型定义运算符运算符“”重载函数为友元,在重载函数为友元,在istream.h中申明。中申明。 istream& operator(istream&s, char*ps); istream& operator(istream&s, int dest ); .10面向对象技术与Visual C+-第7章格式化输入格式化输入/输出输出 n nC+提供了两种进行输入提供了两种进行输入/输出格式化的方输出格式化的方法:法:n n一种是用一种是用一种是用一种是用iosios类成员函数进行格
9、式化。类成员函数进行格式化。类成员函数进行格式化。类成员函数进行格式化。n n另一种是用专门的操作符函数进行格式化。另一种是用专门的操作符函数进行格式化。另一种是用专门的操作符函数进行格式化。另一种是用专门的操作符函数进行格式化。11面向对象技术与Visual C+-第7章 用用ios类成员函数格式化类成员函数格式化 n nios类成员函数主要是通过对类成员函数主要是通过对状态标志状态标志、输、输出宽度、填充字符以及输出精度的操作来出宽度、填充字符以及输出精度的操作来完成输入完成输入/输出格式化。输出格式化。n n输入输入/输出的格式由各种状态标志来确定输出的格式由各种状态标志来确定,这些状态
10、标志在状态量中各占一位这些状态标志在状态量中各占一位,它们在它们在ios类中定义为枚举量类中定义为枚举量(教材教材P140表表7-2).n n枚举量定义在枚举量定义在ios类中,因此引用时必须包类中,因此引用时必须包含含ios:前缀。使用时应该全部用符号名,绝前缀。使用时应该全部用符号名,绝不要用数值。不要用数值。12面向对象技术与Visual C+-第7章用用ios成员函数对状态标志进行操作成员函数对状态标志进行操作 n nios类有类有3个成员函数可以对状态标志进行操个成员函数可以对状态标志进行操作,并且定义了一个作,并且定义了一个long型数据成员记录当型数据成员记录当前状态标志。这些状
11、态标志可用位或运算前状态标志。这些状态标志可用位或运算符符“|”进行组合。进行组合。 n n设置状态标志设置状态标志设置状态标志设置状态标志 用用 setf函数设置状态标志,函数设置状态标志, 其一般格式如其一般格式如下:下: long ios:setf(long flags)13面向对象技术与Visual C+-第7章n n清除状态标志清除状态标志清除状态标志清除状态标志用用用用unsetfunsetf函数清除状态标志,其一般格式如下:函数清除状态标志,其一般格式如下:函数清除状态标志,其一般格式如下:函数清除状态标志,其一般格式如下:long long ios:unsetf(longios
12、:unsetf(long flags) flags)n n取状态标志取状态标志取状态标志取状态标志 用函数用函数用函数用函数flapsflaps取状态标志有两种形式,其格式分别取状态标志有两种形式,其格式分别取状态标志有两种形式,其格式分别取状态标志有两种形式,其格式分别如下:如下:如下:如下: long long iosios: flags( ) : flags( ) long long ios:flags(longios:flags(long flag) flag)例例例例7-17-1 例例例例7-2 7-2 14面向对象技术与Visual C+-第7章用用ios成员函数设置输出宽度成员函
13、数设置输出宽度n n设置输出宽度函数有两种形式,其格式分设置输出宽度函数有两种形式,其格式分别如下:别如下: int ios:width(int len) int ios:width()n n第一种形式是设置输出宽度,并返回原来第一种形式是设置输出宽度,并返回原来的输出宽度;第二种形式是返回当前输出的输出宽度;第二种形式是返回当前输出宽度,输出宽度为宽度,输出宽度为0。15面向对象技术与Visual C+-第7章设置填充字符设置填充字符 填充字符的作用是当输出值不满输出宽度时填充字符的作用是当输出值不满输出宽度时用填充字符来填充,默认填充字符为空格。用填充字符来填充,默认填充字符为空格。它与它
14、与width()函数配合使用,否则没有意义。函数配合使用,否则没有意义。n n设置填充字符函数有两种形式,其格式分设置填充字符函数有两种形式,其格式分别如下:别如下: char ios:fill(char ch) char ios:fill( )n n第一种形式是重新设置填充字符,并返回第一种形式是重新设置填充字符,并返回设置前的填充字符;第二种形式是返回当设置前的填充字符;第二种形式是返回当前的填充字符。前的填充字符。16面向对象技术与Visual C+-第7章设置输出精度设置输出精度 n n设置浮点数输出精度有两种形式,其格式设置浮点数输出精度有两种形式,其格式分别如下:分别如下: int
15、 ios:precision(int p) int ios:precision()n n第一种形式是重新设置输出精度,并返回第一种形式是重新设置输出精度,并返回设置前的输出精度;第二种形式是返回当设置前的输出精度;第二种形式是返回当前的输出精度。前的输出精度。n n例例7-37-317面向对象技术与Visual C+-第7章用操作符函数格式化用操作符函数格式化 n n为了不直接以标志位的方式去处理流的状为了不直接以标志位的方式去处理流的状态,态, c+标准库提供了标准的操作符函数专标准库提供了标准的操作符函数专门操控这些状态。门操控这些状态。n n这组函数不属于任何类成员,定义在这组函数不属于
16、任何类成员,定义在iomanip.h头文件中。头文件中。n n将它们用在提取运算符将它们用在提取运算符“”或插入运算或插入运算符符“”后面来设定输入后面来设定输入/输出格式,即在输出格式,即在读写对象之间插入一个修改状态的操作。读写对象之间插入一个修改状态的操作。n n其中有些函数没有参数,所以又叫操作符。其中有些函数没有参数,所以又叫操作符。 18面向对象技术与Visual C+-第7章n n设置输入设置输入设置输入设置输入/ /输出宽度函数输出宽度函数输出宽度函数输出宽度函数setw(intsetw(int) ) 例例例例7-47-4n n设置输出填充字符函数设置输出填充字符函数设置输出填
17、充字符函数设置输出填充字符函数setfill(intsetfill(int) ) 例例例例7-47-4n n设置输出精度函数设置输出精度函数设置输出精度函数设置输出精度函数setprecision(intsetprecision(int) ) 例例例例7_57_5n n设置输入设置输入设置输入设置输入/ /输出整型数数制函数输出整型数数制函数输出整型数数制函数输出整型数数制函数decdec、hexhex和和和和octoct . . 例例例例7_67_6 例例例例7_87_8 例例例例7_97_9n n取消输入结束符函数取消输入结束符函数取消输入结束符函数取消输入结束符函数wsws 例例例例7_
18、107_10 n n控制换行操作符控制换行操作符控制换行操作符控制换行操作符endlendl ( ( 在在在在iostream.hiostream.h头文件中定义头文件中定义头文件中定义头文件中定义) )n n代表输出单字符代表输出单字符代表输出单字符代表输出单字符“ “0”0”的操作符的操作符的操作符的操作符ends(ends(在在在在iostream.hiostream.h中定义中定义中定义中定义) )n n用户自定义操作符用户自定义操作符用户自定义操作符用户自定义操作符n n格式格式格式格式: : stream(stream(或或或或istreamistream)& )& manip_n
19、ame(ostreammanip_name(ostream& & stream)stream) 自自自自定义语句序列定义语句序列定义语句序列定义语句序列; return stream; return stream;n n例例7_117_11 例例7_12 7_12 19面向对象技术与Visual C+-第7章 文件的输入文件的输入/输出输出 n n C+把文件看作是一个字符(字节)的序把文件看作是一个字符(字节)的序列,即由一个个字符(字节)顺序组成。列,即由一个个字符(字节)顺序组成。n n根据数据的组织形式,可分为根据数据的组织形式,可分为ASCII码文件码文件和二进制文件。和二进制文件。
20、n nASCII码文件又称为文本文件,它的每一码文件又称为文本文件,它的每一个字节存放一个个字节存放一个ASCII码,代表一个字符。码,代表一个字符。n n二进制文件是把内存中的数据按其在内二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘文件存存中的存储形式原样输出到磁盘文件存放。放。 20面向对象技术与Visual C+-第7章n nC+有三种文件流类:有三种文件流类:n n输入输入输入输入/ /输出文件流类输出文件流类输出文件流类输出文件流类fstreamfstreamn n输入文件流类输入文件流类输入文件流类输入文件流类ifstreamifstreamn n输出文件流类输出
21、文件流类输出文件流类输出文件流类ofstreamofstreamn n它们分别从它们分别从I/O流中的流中的iostream、istream、ostream流类中派生而来。流类中派生而来。n n这些文件流类都定义在这些文件流类都定义在fstream.h头文件中,头文件中,因此,要使用文件流类,必须在程序开始因此,要使用文件流类,必须在程序开始包含该头文件。包含该头文件。21面向对象技术与Visual C+-第7章C+中进行文件操作的一般步骤中进行文件操作的一般步骤 n n为文件定义一个流类对象;为文件定义一个流类对象;为文件定义一个流类对象;为文件定义一个流类对象;n n使用使用使用使用ope
22、n( )open( )函数建立(或打开)文件。如果文件函数建立(或打开)文件。如果文件函数建立(或打开)文件。如果文件函数建立(或打开)文件。如果文件不存在,则建立该文件;如果磁盘上已存在该文不存在,则建立该文件;如果磁盘上已存在该文不存在,则建立该文件;如果磁盘上已存在该文不存在,则建立该文件;如果磁盘上已存在该文件,则打开该文件;件,则打开该文件;件,则打开该文件;件,则打开该文件;n n进行读写操作。在建立(或打开)的文件上执行进行读写操作。在建立(或打开)的文件上执行进行读写操作。在建立(或打开)的文件上执行进行读写操作。在建立(或打开)的文件上执行所要求的输入所要求的输入所要求的输入
23、所要求的输入/ /输出操作。一般来说,在内存与外输出操作。一般来说,在内存与外输出操作。一般来说,在内存与外输出操作。一般来说,在内存与外设的数据传输中,由内存到外设称为输出或写,设的数据传输中,由内存到外设称为输出或写,设的数据传输中,由内存到外设称为输出或写,设的数据传输中,由内存到外设称为输出或写,反之则称为输入或读;反之则称为输入或读;反之则称为输入或读;反之则称为输入或读;n n使用使用使用使用close()close()函数关闭文件。当完成操作后,应把函数关闭文件。当完成操作后,应把函数关闭文件。当完成操作后,应把函数关闭文件。当完成操作后,应把打开的文件关闭,避免误操作。打开的文
24、件关闭,避免误操作。打开的文件关闭,避免误操作。打开的文件关闭,避免误操作。22面向对象技术与Visual C+-第7章n n在C+中,打开一个文件就是将这个文件与一个流建立关联;关闭一个文件就是取消这种关联。n nopen()函数的原型在fstream.h中定义。另外,在fstream、ifstream和ofstream流类中均有定义。其原型为:void open(char *filename,int mod,int access);其中第一个参数是用来传递文件名;第二个参数的值决定文件的使用方式,如表7-4所示;第三个参数的值决定文件的访问方式。 23面向对象技术与Visual C+-第7章n n打开文件的一般格式如下:.open(,);n n关闭文件的一般格式如下:.close();24面向对象技术与Visual C+-第7章