面向对象程序设计第十一章I.ppt
第十一章 C+的I/O流类库,11.1 流的概念,11.2 屏幕输出操作,11.3 键盘输入操作,11.4 格式化输入和输出,11.5 文件的输入和输出,11.1 流的概念,所谓“流”是指数据的流动,即指数据从一个位置流向另一个位置。,11.1 流的概念,*C+语言可以继续使用C语言的标准库函数实现输入/输出功能;*C+为程序员提供了功能完整、具有类层次结构、可方便扩充的流类库实现输入/输出功能。*按面向对象方法组织的多个流类及其类层次集合构成了I/O流类库,简称为流库。,11.1 流的概念,*C+语言的I/O流类由两类平行基类ios和streambuf组成,所有流类都通过这两个基类派生出来。*ios类是所有ios类层次的基类,提供输入/输出所需要的公共操作。*streambuf是一个抽象类、具有3个派生类,streambuf提供对缓冲区的底层操作支持,如设置缓冲区、对缓冲区指针进行操作、缓冲区取字符和向缓冲区插入字符等功能。,Ios流类层次关系图,ios流类层次关系,ios流类层次关系,ios类包含一个指向streambuf的指针,提供格式标志(flags),进行I/O格式化处理、文件设置模式及提供建立I/O流的方法。ios基类主要完成其全部派生类中均需要的流的状态设置、状态报告、显示精度、域宽、填充字符设置和文件流的操作模式的定义等。,ios流库及其派生类功能,11.2 屏幕输出操作,插入符(),put(),write(),11.2 屏幕输出操作,一、使用预定义的插入符,#include void main()int x=90;cout“x=”xendl;,11.2 屏幕输出操作,二、使用成员函数put()输出一个字符,cout.put(A);/精确的输出一个字符coutA;/与上同,但是可受格式化参量的影响.,11.2 屏幕输出操作,二、使用成员函数put()输出一个字符,put()的参数可以是字符变量,也可以是字符常量,put()的函数返回值是ostream类的对象,所以可 以串接多个put()函数。,11.2 屏幕输出操作,三、使用成员函数write()输出一个字符串,cout.write(const char*str,int n)其中,str用来存放一个字符串,或一个字符串常量;n用来指定输出字符串中字符的个数。,11.2 屏幕输出操作,三、使用成员函数write()输出一个字符串,11.3 键盘输入操作,提取符(),get(),getline(),read(),11.3 键盘输入操作,一、使用预定义的提取符,#include void main()int x,y;cinxy;,二、使用成员函数get()获取一个字符,11.3 键盘输入操作,比较:使用成员函数get()与使用提取符“”,“”将跳过任何空白字符(空格、tab符、backspace符和回车符,而get()不跳过空白符。,三、使用成员函数getline()获取一行字符,11.3 键盘输入操作,cin.getline(char*buf,int n,deline=n)其中,buf用来存放一个字符串;n用来限定读取的字符个数不能超过n-1个(最后要加结束标志);第三个参数用来限定一行字符的结束标志,默认为n。,例:统计从键盘上输入每一行字符的个数,并从中选出最长的行的字符个数,统计共输入多少行。,gcount()用来返回上一次函数getline()实际读入的字符个数,包括空白符。,例:统计从键盘上输入每一行字符的个数,并从中选出最长的行的字符个数,统计共输入多少行。,四、使用成员函数read()获取若干字符,11.3 键盘输入操作,cin.read(char*buf,int size)其中,buf用来存放一个字符串;size用来指定读取字符的个数。可以用gcount()来统计上一次read()函数读取的字符个数。,四、使用成员函数read()获取若干字符,11.3 键盘输入操作,程序结束:读入79个字符;,11.4 格式化输入和输出,C+提供了两类格式化输入/输出方法:ios类成员函数格式控制操作符函数输入/输出格式控制,11.4 格式化输入和输出,一、使用ios类成员函数进行格式输出,ios类提供了所有派生类中都需要的流的状态设置标志,其成员函数主要是通过对状态标志,输出宽度,填充字符以及输出精度的设置来实现输入/输出的格式化功能。,输入/输出状态标志共有15个,每个状态标志各占一个二进制位,每一个二进制位称为一个状态标志位。,ios输入/输出状态标志表,ios输入/输出状态标志表(续),11.4 格式化输入和输出,1、使用ios的成员函数设置状态标志,ios类定义了 设置状态标志 取消状态标志 取状态标志三类成员函数,并且定义了一个long型数据成员记录当前状态标志。这些状态标志可以通过按位或运算符“|”进行组合,实现复合功能,11.4 格式化输入和输出,1、使用ios的成员函数设置状态标志,设置状态标志ios类定义了成员函数setf设置状态标志,其函数原型为:long ios:setf(long flags),11.4 格式化输入和输出,1、使用ios的成员函数设置状态标志,清除状态标志ios类定义了成员函数unsetf用于取消已经设置的状态标志,其函数原型为:long ios:unsetf(long flags),11.4 格式化输入和输出,1、使用ios的成员函数设置状态标志,取状态标志ios类定义了两个取状态标志的成员函数flags其函数原型为:格式一:long ios:flags();函数返回当前流的状态标志格式二:long ios:flags(long flags)函数设置指定位的状态标志,并返回当前流的状态标志,与setf()的区别是:setf()是在原有的基础上追加设置,不改变原有设置;flgs()使用新的设置覆盖原有的设置,改变了原有设置。,11.4 格式化输入和输出,1、使用ios的成员函数设置状态标志,设置状态标志必须通过流对象cin和cout调用ios的成员函数,其调用格式如下:流类对象.ios成员函数名(ios:状态标志),状态标志应用,#include void main()int n;double a;n=588;a=588.18;cout.setf(ios:showpos);/正数前标注正号+coutn aendl;cout.setf(ios:scientific);/按科学记数法输出coutnendl;coutaendl;cout.setf(ios:hex);/按16进制输出coutnendl;coutaendl;cout.unsetf(ios:showpos);/取消“+”号标注coutnendl;coutaendl;,注:ios类的标志位一经设置,直至取消设置前始终有效,11.4 格式化输入和输出,2、输出宽度、填充字符及输出精度设置,输出宽度设置格式一:int ios:width(int n)设置输出宽度为n,并返回原来的输出宽度 格式二:int ios:width()返回当前的输出宽度。,11.4 格式化输入和输出,2、输出宽度、填充字符及输出精度设置,填充字符设置 格式一:char ios:fill(char ch)设置填充字符ch,并返回设置前的填充字符。格式二:char ios:fill()返回当前的填充字符。注:预实现填充字符必须和width配合使用,否则没有实际意义,11.4 格式化输入和输出,2、输出宽度、填充字符及输出精度设置,输出精度设置 格式一:int ios:precision(int n)设置输出精度为n位,并返回设置前的输出精度。格式二:int ios:precision()返回当前的输出精度。注:任何一种设置形式必须用流对象cin和cout调用,宽度设置应用,#include void main()double values=1.18,28.18,518.88;for(int i=0;i3;i+)cout.width(10);coutvaluesiendl;for(int j=0;j3;j+)cout.width(10);cout.fill(#);coutvaluesjendl;,11.4 格式化输入和输出,二、操作符函数的格式控制,操作符函数定义在iomanip.h头文件之中。不属于任何类成员,将他们用在提取运算符“”或插入运算符“”后面来设定输入输出格式,即在读写对象之间插入一个修改状态的操作C+操作符函数包括:无参操作符函数和有参操作符函数,无参操作符及其功能,带参操作符及其功能,宽度设置应用,#include#include void main()double values=1.18,28.18,518.88;for(int i=0;i3;i+)coutvaluesiendl;for(int j=0;j3;j+)coutsetw(10)valuesjendl;,11.4 格式化输入和输出,三、自定义操作符函数的格式化,C+允许程序员自行定义操作符函数,包括:自定义输入操作符函数自定义输出操作符函数,11.4 格式化输入和输出,三、自定义操作符函数的格式化,自定义输出操作符函数ostream,自定义输出操作符函数的应用,#include#include ostream,11.4 格式化输入和输出,三、自定义操作符函数的格式化,自定义输入操作符函数istream,自定义输入操作符函数的应用,#include#include istream,11.5 文件的输入和输出,依数据的组织形式,文件可分为,文本文件文本文件又称为ASCII码文件,它的每一个字节以ASCII码形式存放一个字符,代表一个字符。二进制文件二进制文件是按数据在内存中的存储形式原样输出到磁盘文件中存储。例如:整数数据201106,以二进制文件存储占2个字节,以文本文件存储占6个字节,11.5 文件的输入和输出,文件的打开和关闭,C+程序进行文件输入/输出时,必须:创建一个输入/输出流将创建的流与文件相关联,即打开文件,才可以对文件进行读写操作操作完成之后需要关闭所打开的文件,11.5 文件的输入和输出,文件输入/输出操作的一般步骤,1.用#include指令包含头文件fstream.h;2.为文件定义一个流类对象;如:ifstream in;/定义输入流类对象inofstream out;/定义输出流类对象outfstream io;/定义输入/输出流类对象io3.应用流对象的成员函数open()函数建立(或打开)文件。4.进行读写操作5使用流对象的成员函数close()函数关闭文件,11.5 文件的输入和输出,注意,open()函数原型在fstream.h中定义,函数原型如下:void open(char*filename,int mode,int access);第一个参数用于传递文件名;第二个参数mode值表示文件的使用方式;第三个参数表示文件的访问方式;,文件使用方式选项表,文件访问方式选项表,11.5 文件的输入和输出,一、文件的打开和关闭操作,1.打开文件方法一,fstream;.open(“”,);,也可写为:,fstream(“”,);,11.5 文件的输入和输出,一、文件的打开和关闭操作,1.打开文件方法一,例如使用写方式打开一个文本文件file.txt fstream outfile;outfile.open(“file.txt”,ios:out);,例如使用读方式打开一个二进制文件f1.txt fstream outfile(“f1.txt”,ios:in|ios:binary);,11.5 文件的输入和输出,一、文件的打开和关闭操作,2.打开文件方法二,ofstream;.open(“”);,也可写为:,ofstream(“”);,打开某个写文件格式:,11.5 文件的输入和输出,一、文件的打开和关闭操作,2.打开文件方法二,ifstream;.open(“”);,也可写为:,ifstream(“”);,打开某个读文件格式:,11.5 文件的输入和输出,一、文件的打开和关闭操作,3.关闭文件,.close();,其中,是待关闭的文件名。,11.5 文件的输入和输出,二、文本文件的读写操作,例:编程将一些字符信息写入指定文件中,编程将上例的文件内容拷贝到另一个文件中,11.6 自定义数据类型的输入和输出,C+可以通过重载 输入运算符“”输出运算符“”实现自定义数据类型的输入/输出。,11.6 自定义数据类型的输入和输出,输出运算符重载ostream 参数out是ostream类对象的引用。第二个参数是自定义数据类型class_name的对象的引用。变量名1、变量名2、变量名n是自定义数据类型的各数据成员。,输出运算符重载,#includeclass cio_testint x1;int x2;public:cio_test(int i1=0,int i2=0)x1=i1;x2=i2;friend ostream/直接输出类对象a的数据成员,11.6 自定义数据类型的输入和输出,输入运算符重载istream 输入运算符重载函数也需要定义为类的友元函数。,输出运算符重载,#includeclass cio_test int x1;int x2;int x3;public:cio_test(int i1,int i2,int i3)x1=i1;x2=i2;x3=i3;friend istream,ostream/输出类对象a的数据成员,