资源描述
6.1为何有自己的为何有自己的I/O系统系统一、的/、不包含预定义的输入和输出函数;通过外部库实现。如:stdio iostream、特点优点:灵活性大、功能强缺点:不提供用户定义对象的支持例:例:struct my_structstruct my_struct int count;int count;char s80;char s80;double balance;double balance;cust;cust;想用想用printfprintf实现输出:实现输出:printf(printf(“%my_struct%my_struct”,cust);,cust);是不能实现的。是不能实现的。printfprintf只能识别预定义类型,不能将功能延伸到新的数据类型。只能识别预定义类型,不能将功能延伸到新的数据类型。的改进:的改进:、与原的输入输出函数有重复;、与原的输入输出函数有重复;、进行重载,使标准的输入输出运算符能处理用户定义类、进行重载,使标准的输入输出运算符能处理用户定义类型,扩充了功能;型,扩充了功能;、采用继承的方法建立实用的流库,功能更强大、方便,、采用继承的方法建立实用的流库,功能更强大、方便,并便于扩充。并便于扩充。6.2C流库结构流库结构一、定义一、定义C+C+流库流库(stream library)(stream library)是用继承方法建立起来是用继承方法建立起来的一个输入输出的一个输入输出类库类库,包含有两个平行基类:streambufstreambuf类、类、iosios类,在类,在iostream.hiostream.h中定义。所有流中定义。所有流类均以两者之间作为其基类。类均以两者之间作为其基类。1 1、streambufstreambuf:负责缓冲区处理:负责缓冲区处理字符序列字符序列输入缓冲区指针输入缓冲区指针输出缓冲区指针输出缓冲区指针(1 1)提供对缓冲区的低级操作,)提供对缓冲区的低级操作,如:对缓冲区指针进行操作、从缓冲区取字符、向缓冲区存储如:对缓冲区指针进行操作、从缓冲区取字符、向缓冲区存储字符等。字符等。(2 2)主要是作为流库的其它部分使用的基类)主要是作为流库的其它部分使用的基类Streambuf:Streambuf:负负责缓冲区处理责缓冲区处理filebuffilebufstrstreambufstrstreambufconbufconbuf使用文件来保存使用文件来保存字符序列。字符序列。扩展了基类的文扩展了基类的文件处理能力。件处理能力。使用串来保存字使用串来保存字符序列。符序列。扩展了基类在内扩展了基类在内存中提取和插入存中提取和插入操作的缓冲区管操作的缓冲区管理。理。提供光标控制、设提供光标控制、设置颜色、定义活动置颜色、定义活动窗口、清屏、清一窗口、清屏、清一行等成员函数,为行等成员函数,为输出操作提供缓冲输出操作提供缓冲区管理。区管理。(Borland C+3.0Borland C+3.0)(3 3)streambufstreambuf的派生类,与基类不同在于对输入缓冲区指针和的派生类,与基类不同在于对输入缓冲区指针和输出缓冲区指针的处理方法,并根据各自的用途扩充了特殊的输出缓冲区指针的处理方法,并根据各自的用途扩充了特殊的操作。操作。(4 4)存在于几个)存在于几个.h.h文件中。文件中。(5 5)使用:一般应使用)使用:一般应使用streambufstreambuf的派生类。的派生类。2 2、iosios类及其派生类:提供用户使用流类的接口类及其派生类:提供用户使用流类的接口(1 1)提供输入和输出所需要的公共操作。)提供输入和输出所需要的公共操作。(2 2)一个指向一个指向streambufstreambuf的指针的指针格式化标志:格式化标志:format flagsformat flagsio_stateio_state:对:对I/OI/O错误进行处理错误进行处理(3 3)相关流:相互关联的流,其中之一被使用时,其它流也受)相关流:相互关联的流,其中之一被使用时,其它流也受影响。影响。如:如:cin,coutcin,coutiosios:用户使用流:用户使用流类的接口类的接口istreamistreamostreamostreamfstreambasefstreambasestrstreambasestrstreambase提供对提供对streambufstreambuf进行进行插入时的格式插入时的格式化或非格式化化或非格式化转换,并对所转换,并对所有系统预定义有系统预定义的类型重载输的类型重载输入运算符入运算符“”;提供了流的大提供了流的大部分输入操作。部分输入操作。提供对提供对streambufstreambuf的格式化或非格的格式化或非格式化输出,对于式化输出,对于预定义类型,重预定义类型,重载了输出运算符:载了输出运算符:“”;提供了流主要的提供了流主要的输出操作。输出操作。提供文件流的公提供文件流的公共操作,如:文共操作,如:文件打开、关闭、件打开、关闭、连到打开文件的连到打开文件的文件描述字、返文件描述字、返回所用的缓冲冲回所用的缓冲冲以及使用指定的以及使用指定的缓冲区等。缓冲区等。专门处理字符串专门处理字符串流。流。(4 4)iosios直接派生的层次上,定义了输入流、输出流、文件流、直接派生的层次上,定义了输入流、输出流、文件流、串流的基本操作。以此四种流类为基础流类,可以组合出多种串流的基本操作。以此四种流类为基础流类,可以组合出多种实用的流:实用的流:如:输入如:输入/输出流、输入输出流、输入/输出文件流、输入输出文件流、输入/输出串流、输出串流、屏幕输出流、输入文件流、输出文件流、输入串流和输出屏幕输出流、输入文件流、输出文件流、输入串流和输出串流。串流。3 3、C C的几个预定义流:的几个预定义流:cincin:与标准输入设备相关的流;:与标准输入设备相关的流;cout:cout:与标准输出设备相关的流;与标准输出设备相关的流;cerrcerr和和clog:clog:与标准错误输出设备相关的流;与标准错误输出设备相关的流;(cerr(cerr没有被缓冲,没有被缓冲,发给它的任何内容立即输出发给它的任何内容立即输出)6.3输入和输出输入和输出6.3.1istream一、一、istreamistream提供主要的输入操作,是用户使用流库提供主要的输入操作,是用户使用流库的主要界面之一。的主要界面之一。二、二、istreamistream的简要介绍的简要介绍1 1、重载了、重载了6 6个个getget函数函数2 2、getlinegetline:与:与getget功能相同,只是分界符也读入功能相同,只是分界符也读入3 3、read:read:输入给定数据的字符到数组输入给定数据的字符到数组4 4、辅助操作:、辅助操作:5 5、随机移动文件指针、随机移动文件指针6.3.2ostream一、一、ostreamostream提供主要的输出操作,是用户使用流库提供主要的输出操作,是用户使用流库的主要界面之一。的主要界面之一。二、二、ostreamostream的简要介绍的简要介绍1 1、输出操作、输出操作2 2、随机移动文件指针、随机移动文件指针6.3.3输出运算符输出运算符“”一、又称为提取运算符,包含两个操作数:一、又称为提取运算符,包含两个操作数:1 1、左操作数:、左操作数:istreamistream类类型的对象;类类型的对象;2 2、右操作数:一个预定义类型的变量,也可为重载了该运、右操作数:一个预定义类型的变量,也可为重载了该运算符的类的对象。算符的类的对象。3 3、可以识别预定义类型,也可以识别重载后的类的对象。、可以识别预定义类型,也可以识别重载后的类的对象。二、运算:二、运算:1 1、采用左结合的方式、采用左结合的方式2 2、输入语句将跳过空白,从标准输入读取数字。、输入语句将跳过空白,从标准输入读取数字。三、实例三、实例6 62 2四、四、”的重载:第二个参数必须是一个引用,目的在于的重载:第二个参数必须是一个引用,目的在于objobj的值能在函数外被修改。的值能在函数外被修改。6.4格式控制格式控制C C中可以用中可以用C C的的printfprintf和和scanfscanf进行格式化进行格式化I/OI/O(缺点在哪里?)。缺点在哪里?)。又提供了两种进行格式控制的方法又提供了两种进行格式控制的方法1 1、使用、使用iosios类有关格式控制的成员函数;类有关格式控制的成员函数;2 2、使用操纵符(、使用操纵符(manipulatormanipulator)的特殊类型函数。)的特殊类型函数。6.4.1用用ios类成员函数格式化类成员函数格式化一、格式由状态标志确定,状态标志在状态量中各占一位;一、格式由状态标志确定,状态标志在状态量中各占一位;二、详细的格式控制枚举量(表二、详细的格式控制枚举量(表6-16-1););三、使用三、使用iosios成员函数对流的输入输出操作进行格式控制:成员函数对流的输入输出操作进行格式控制:1 1、设置状态标志:、设置状态标志:setfsetf long ios:setf(long flags)long ios:setf(long flags)格式状态标志存放于一个格式状态标志存放于一个longlong整数中,每个状态标志是整数中,每个状态标志是整数整数longlong中的一位。中的一位。使用方法:使用方法:stream.setf(ios:showbase)stream.setf(ios:showbase)实例:实例:2 2、清除状态标志:、清除状态标志:unsetfunsetf long ios:unsetf(long flags)long ios:unsetf(long flags)3 3、取状态标志:、取状态标志:long ios:flag();long ios:flag();返回与流相关的当前的状态标志值;返回与流相关的当前的状态标志值;long ios:flag(long flags);long ios:flag(long flags);将流的状态标志值设置为将流的状态标志值设置为flagsflags并返并返回设置前的状态标志值。回设置前的状态标志值。4 4、设置域宽,填充字符,设置精度、设置域宽,填充字符,设置精度int ios:width(int len);int ios:width(int len);设置域宽,并返回原来的域宽;设置域宽,并返回原来的域宽;int ios:width();int ios:width();返回当前域宽返回当前域宽char ios:fill(char ch);char ios:fill(char ch);填充字符填充字符int ios:precision(int num);int ios:precision(int num);设置显示精度。设置显示精度。6.4.2用操纵函数控制格式用操纵函数控制格式一、操纵函数:一、操纵函数:特殊的,类似于函数的运算符操纵符。以一个流引特殊的,类似于函数的运算符操纵符。以一个流引用作为参数,并返回同一流的引用,因此,可以嵌入到输用作为参数,并返回同一流的引用,因此,可以嵌入到输入或输出操作链中。入或输出操作链中。1 1、实例:、实例:2 2、操纵符函数仅改变流的状态标志;、操纵符函数仅改变流的状态标志;3 3、标准操纵符函数(表、标准操纵符函数(表6 62 2););4 4、在任何时候刷新流、在任何时候刷新流ostream:ostream:ostreamflush;ostreamflush;5 5、用户可自定义操纵符函数。、用户可自定义操纵符函数。6.5文件文件I/O文件的读出过程可以分解为三个抽象的概念:文件的读出过程可以分解为三个抽象的概念:往流中加入一个字符;往流中加入一个字符;从流中取出一个字符;从流中取出一个字符;一旦建立一个流,把它与文件相关连以便用来一旦建立一个流,把它与文件相关连以便用来读写。读写。因此,因此,C C和和C C对文件处理的不同:把文件看对文件处理的不同:把文件看为流,要进行文件操作,先要建立流,然后将文为流,要进行文件操作,先要建立流,然后将文件与流相关联(打开文件),然后进行读写,读件与流相关联(打开文件),然后进行读写,读写完成后,关闭文件。写完成后,关闭文件。文件文件openfstreamifstramofstramclose6.5.1 6.5.1 文件的打开和关闭文件的打开和关闭1 1、有三种类型的文件流:、有三种类型的文件流:输入文件流输入文件流输出文件流输出文件流输入输入/输出文件流输出文件流2 2、要打开相应文件,必须要建立对、要打开相应文件,必须要建立对应的流,并与文件建立关联。应的流,并与文件建立关联。3 3、关联的方式:、关联的方式:open()open()详细动作表详细动作表详细动作表详细动作表6-36-36.5.26.5.2文件的读写文件的读写1 1、读:、读:从流中取一个元素从流中取一个元素2 2、写:、写:向流中写入一个元素向流中写入一个元素3 3、实例:完成一个自己的、实例:完成一个自己的“文件复制程序文件复制程序”
展开阅读全文