流类库和输入输出-宿州学院.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《流类库和输入输出-宿州学院.ppt》由会员分享,可在线阅读,更多相关《流类库和输入输出-宿州学院.ppt(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 流类库和输入流类库和输入/输出输出本本章章的的最最主主要要目目的的就就是是把把对对象象保保存存到到磁磁盘盘文文件件中中并并从从磁盘文件重建对象磁盘文件重建对象。C+语言中并没有输入语言中并没有输入/输出语句,而是在标准库输出语句,而是在标准库里包含了一个里包含了一个I/O流类库,它与标准模板库同为流类库,它与标准模板库同为C+标标准库中最重要的组成部分。数据从一个对象到另一个对准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为象的传送被抽象为“流流”。数据的输入。数据的输入/输出就是通过输输出就是通过输入入/输出流来实现的。输出流来实现的。流是一种抽象的概念,负责在
2、数据的产生者和数据流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。的使用者之间建立联系,并管理数据的流动。第九章第九章 流类库和输入流类库和输入/输出输出9.1 C+的基本流类体系的基本流类体系 9.3 标准设备的输入标准设备的输入/输出输出 9.2 输入输出的格式控制(选读)输入输出的格式控制(选读)9.4 文件的输入与输出文件的输入与输出 9.5 字符串流(选读)字符串流(选读)9.6 文件与对象文件与对象 9.1 C+的基本流类体系的基本流类体系流类体系:流类体系:以抽象类模板以抽象类模板basic_ios为基类,流类模板派生体系见图为基类,流类模板派
3、生体系见图9.1。整个流类模板体系的。整个流类模板体系的标准标准I/O在头文件在头文件中说明,它包含中说明,它包含头文件头文件、和和。而输入输出。而输入输出文件流文件流部分在头文件部分在头文件中说明。中说明。图图9.1 主要输入主要输入/输出流模板层次输出流模板层次 basic_ iosbasic_ streambufbasic_ istreambasic_ ostreambasic_ ifstreambasic_ iostreambasic_ ofstreambasic_ fstream指针指针9.1 C+的基本流类体系的基本流类体系 basic_ios类模板提供了对流进行格式化输入输出和错
4、类模板提供了对流进行格式化输入输出和错误处理的成员函数。所有派生都是公有派生。误处理的成员函数。所有派生都是公有派生。basic_istream类模板提供完成提取(输入)操作的成员函类模板提供完成提取(输入)操作的成员函数,而数,而basic_ostream类模板提供完成插入(输出)操作类模板提供完成插入(输出)操作的成员函数。的成员函数。basic_iostream类本质上是前两者的类本质上是前两者的聚合聚合,并没有增加成员。派生全部为公有派生并没有增加成员。派生全部为公有派生。有关有关模板派生模板派生请参见教学指导书第请参见教学指导书第8章中章中“类模板的派类模板的派生的讨论生的讨论”ba
5、sic_streambuf不是不是basic_ios的派生类,而是一个的派生类,而是一个独立的类,只是独立的类,只是basic_ios有一个保护访问限制的指针指向有一个保护访问限制的指针指向它。它。类类basic_streambuf的作用是管理一个流的缓冲区。的作用是管理一个流的缓冲区。流类体系说明:流类体系说明:9.1 C+的基本流类体系的基本流类体系标准输入标准输入/输出流对象:输出流对象:在在C+C+的流类库的流类库中定义了四个全局流对象:中定义了四个全局流对象:cin,cout,cerr和和clog。可以完成人机交互的功能。可以完成人机交互的功能。cin标准输入流对象,键盘为其对应的标
6、准设备。标准输入流对象,键盘为其对应的标准设备。cout标准输出流对象,显示器为标准设备。标准输出流对象,显示器为标准设备。cerr和和clog标准错误输出流,输出设备是显示器。标准错误输出流,输出设备是显示器。其中其中cin、cout和和clog是带缓冲区的,缓冲区由是带缓冲区的,缓冲区由streambuf类对象来管理。而类对象来管理。而cerr为为非缓冲区流,一旦非缓冲区流,一旦错误发生立即显示。错误发生立即显示。要使用这四个功能,必须包含要使用这四个功能,必须包含文件。文件。9.1 C+的基本流类体系的基本流类体系重载的重载的提取运算符提取运算符“”(stream_extraction
7、operator)和)和插入运算符插入运算符“和和(istream&,className&);friend ostream&operator”或或“”和和“”或或“”的左操作数;第二个参数为用户定义类的引用,的左操作数;第二个参数为用户定义类的引用,作为右操作数。作为右操作数。流用作函数参数,必须是引用调用,不能是传值流用作函数参数,必须是引用调用,不能是传值调用。因为这里要求处理流本身,而不是副本。调用。因为这里要求处理流本身,而不是副本。【例【例9.5】改进自定义字符串类,重载插入运算符改进自定义字符串类,重载插入运算符“”。【例【例9.6】用户定义的复数类用户定义的复数类Complex的
8、输入与输出。的输入与输出。9.4 文件的输入与输出文件的输入与输出 本本节节中中文文件件指指的的是是磁磁盘盘文文件件。C+根根据据文文件件(file)内内容容的的数数据据格格式式,可可分分为为两两类类:二二进进制制文文件件和和文文本本文文件件。文文本本文文件件由由字字符符序序列列组组成成,也也称称ASCII码码文文件件,在在文文本本文文件件中中存存取取的的最最小小信信息息单单位位为为字字符符(character),而而二二进进制制文文件件中中存存取的最小信息单位为字节(取的最小信息单位为字节(Byte)。)。C+把每一个文件都看成一个有序的字节流,见图把每一个文件都看成一个有序的字节流,见图9
9、.2,每一个文件或者以文件结束符(每一个文件或者以文件结束符(end of file marker)结束,)结束,或者在特定的字节号处结束。或者在特定的字节号处结束。012436578n-1文件结束符文件结束符图图9.2 C+把文件看作有序的把文件看作有序的n个字节的流个字节的流文件的基本概念:文件的基本概念:9.4 文件的输入与输出文件的输入与输出当打开一个文件时,该文件就和某个流关联起来了。对文件进行读当打开一个文件时,该文件就和某个流关联起来了。对文件进行读写实际上受到一个写实际上受到一个文件定位指针(文件定位指针(file position pointer)的控制。的控制。输入流的指针
10、也称为读指针,每一次提取操作将从读指针当前输入流的指针也称为读指针,每一次提取操作将从读指针当前所指位置开始,每次提取操作自动将读指针向文件尾移动。所指位置开始,每次提取操作自动将读指针向文件尾移动。输出流指针也称写指针,每一次插入操作将从写指针当前位置输出流指针也称写指针,每一次插入操作将从写指针当前位置开始,每次插入操作自动将写指针向文件尾移动。开始,每次插入操作自动将写指针向文件尾移动。9.4.1 文件的打开与关闭文件的打开与关闭 9.4.2 文本文件的读写文本文件的读写9.4.3 二进制文件的读写二进制文件的读写 9.4.4 文件的随机访问(选读)文件的随机访问(选读)9.4.1 文件
11、的打开与关闭文件的打开与关闭文件使用步骤:文件使用步骤:1说明一个文件流对象,这又被称为内部文件:说明一个文件流对象,这又被称为内部文件:ifstream ifile;/只输入用只输入用ofstream ofile;/只输出用只输出用fstream iofile;/既输入又输出用既输入又输出用 9.4.1 文件的打开与关闭文件的打开与关闭2使使用用文文件件流流对对象象的的成成员员函函数数打打开开一一个个磁磁盘盘文文件件。这这样样在在文文件件流流对对象象和和磁磁盘盘文文件件名名之之间间建建立立联联系系。文文件件流流中中说说明明了了三三个个打打开文件的成员函数。开文件的成员函数。void ifst
12、ream:open(const char*,int=ios:in,int=filebuf:openprot);void ofstream:open(const char*,int=ios:out,int=filebuf:opernprot);void fstream:open(const char*,int,int=filebuf:openprot);第一个参数为要打开的磁盘文件名。第二个参数为打开方式,第一个参数为要打开的磁盘文件名。第二个参数为打开方式,有输入(有输入(in),输出(),输出(out)等,打开方式在)等,打开方式在ios基类中定义为基类中定义为枚举类型。第三个参数为指定打开
13、文件的保护方式,一般取默枚举类型。第三个参数为指定打开文件的保护方式,一般取默认。认。所以第二步可如下进行:所以第二步可如下进行:iofile.open(“myfile.txt”,ios:in|ios:out);文件打开方式文件打开方式:是由在是由在ios类中定义的公有枚举成员决定:类中定义的公有枚举成员决定:enum open_mode in=0 x01,out=0 x02,ate=0 x04,app=0 x08,trunc=0 x10,binary=0 x80;9.4.1 9.4.1 文件的打开与关闭文件的打开与关闭 inin标识打开文件用于输入操作标识打开文件用于输入操作(从文件读取从文
14、件读取)。打开方式只要含。打开方式只要含inin,如文件不存在则返回失败。在打开为输入输出方式时(同时用,如文件不存在则返回失败。在打开为输入输出方式时(同时用outout),),编程应注意判断是否失败,失败时千万不可再写入文件。编程应注意判断是否失败,失败时千万不可再写入文件。outout标识打开标识打开文件用于输出操作文件用于输出操作(写入文件写入文件)。如文件不存在,则建。如文件不存在,则建立新文件,如文件存在,未同时设立新文件,如文件存在,未同时设app,inapp,in则文件清空。则文件清空。trunc trunc标识打开文件,并清空它(文件长度截为标识打开文件,并清空它(文件长度截
15、为0 0)。文件不存在)。文件不存在则建立新文件,与则建立新文件,与outout默认操作相同。但与默认操作相同。但与inin配合,文件不存在则返回配合,文件不存在则返回失败。失败。appapp标识打开文件用于输出,原文件内容保留,新数据接在尾部标识打开文件用于输出,原文件内容保留,新数据接在尾部 ateate意思是意思是at endat end,标识打开文件,文件指针在文件尾,但文件指,标识打开文件,文件指针在文件尾,但文件指针可以移动,即新数据可写到任何位置。文件是否清空由其它标识决针可以移动,即新数据可写到任何位置。文件是否清空由其它标识决定。定。后三个标识最好配合后三个标识最好配合out
16、out、inin等一起用,因为不同的等一起用,因为不同的C+C+平台,要平台,要求不同,一起用不会出错。如不一起用,至少求不同,一起用不会出错。如不一起用,至少VC+VC+不认这种格式。不认这种格式。binary binary标识以二进制方式打开文件。同时用标识以二进制方式打开文件。同时用outout时,如文件不存在,时,如文件不存在,则建立新文件,并且新文件能用,不必清状态字。则建立新文件,并且新文件能用,不必清状态字。打开方式解释:9.4.1 文件的打开与关闭文件的打开与关闭 三三个个文文件件流流类类都都重重载载了了一一个个带带默默认认参参数数的的构构造造函函数数,功能与,功能与open函
17、数一样:函数一样:ifstream:ifstream(const char*,int=ios:in,int=filebuf:openprot);ofstream:ofstream(const char*,int=ios:out,int=filebuf:openprot);fstream:fstream(const char*,int,int=filebuf:operprot);所以所以1,2两步可合成:两步可合成:fstream iofile(”myfile.txt”,ios:in|ios:out);9.4.1 文件的打开与关闭文件的打开与关闭打打开开文文件件也也应应该该判判断断是是否否成成功
18、功,若若成成功功,文文件件流流对对象象值值为为非非零零值值,不不成成功功为为0(NULL),文文件件流流对对象象值值物理上就是指它的地址物理上就是指它的地址。因此打开一个文件完整的程序为:因此打开一个文件完整的程序为:fstream iofile(”myfile.txt”,ios:in|ios:out);if(!iofile)/“!”为重载的运算符,见节为重载的运算符,见节 cout”不不能能打打开开文文件件:”myfile.txt”)和和插插入入运运算算符符(”完成完成重构重构对象,而只用一个对象,而只用一个“”完成对象完成对象存入存入文件。文件。9.4.2 文本文件的读写文本文件的读写文本
19、数据文件的读写:文本数据文件的读写:按按C+的的常常规规,资资源源获获取取是是由由构构造造函函数数实实现现,而而资资源源释释放放是是由由析析构构函函数数完完成成。所所以以与与内内存存动动态态分分配配一一样样,由由文文件件重重构构对对象象放放在在构构造造函函数数中中,把把对对象象存存入入文文件件则则放放在在析析构构函函数数中中。详详细细内内容容见见9.6节节,更更深深层层次次的的理理由由见见下下一一章章异异常常处处理理。【例例9.9】只只是是为为了了更更清清楚楚地地显显示示文文件件的的操操作作,常常规规做做法法请请读读者者参参见见【例【例9.13】。】。9.4.3 二进制文件的读写二进制文件的读
20、写对二进制文件进行读写的成员函数:对二进制文件进行读写的成员函数:istream&istream:read(char*,int);/从二进制流提取从二进制流提取istream&istream:read(unsigned char*,int);/第一个参数指定存放有效输入的变量地址第一个参数指定存放有效输入的变量地址,必须必须强制转换强制转换为为char*类型类型/第二个参数指定提取的字节数第二个参数指定提取的字节数,/函数从输入流提取指定数量的字节送到指定地址开始的单元函数从输入流提取指定数量的字节送到指定地址开始的单元ostream&ostream:write(const char*,int
21、);/向二进制流插入向二进制流插入ostream&ostream:write(const unsigned char*,int);/第一个参数指定输出对象的内存地址第一个参数指定输出对象的内存地址,必须必须强制转换强制转换为为char*类型类型/第二个参数指定插入的字节数第二个参数指定插入的字节数,/函数从该地址开始将指定数量的字节插入输入输出流函数从该地址开始将指定数量的字节插入输入输出流9.4.3 二进制文件的读写二进制文件的读写文件结束判断:文件结束判断:读函数并不能知道文件是否结束,可用状态函数读函数并不能知道文件是否结束,可用状态函数int ios:eof()来判断文件是否结束。必须
22、指出系统是根据来判断文件是否结束。必须指出系统是根据当前操作当前操作的实际情况设置状态位,如需根据状态位来判断下一步的实际情况设置状态位,如需根据状态位来判断下一步的操作,必须在一次操作后立即去调取状态位,以判断的操作,必须在一次操作后立即去调取状态位,以判断本次操作是否有效。本次操作是否有效。【例【例9.10】创建二进制数据文件,以及数据文件的读创建二进制数据文件,以及数据文件的读取。这两项操作设计为成员函数。给出与【例取。这两项操作设计为成员函数。给出与【例9.9】不同】不同的读写方式:的读写方式:9.4.3 二进制文件的读写二进制文件的读写二进制文件优点:二进制文件优点:可以控制字节长度
23、,读写数据时不会出现二义可以控制字节长度,读写数据时不会出现二义性,性,可靠性高可靠性高。同时不知格式是无法读取的,。同时不知格式是无法读取的,保密保密性好性好。文件结束后,系统不会再读(见。文件结束后,系统不会再读(见eofbit的说明)的说明),但,但程序不会自动停下来程序不会自动停下来,所以要判断文件中是否,所以要判断文件中是否已没有数据。如写完数据后没有关闭文件,直接开已没有数据。如写完数据后没有关闭文件,直接开始读,则必须把文件定位指针移到文件头。如始读,则必须把文件定位指针移到文件头。如关闭关闭文件后重新打开,文件定位指针就在文件头文件后重新打开,文件定位指针就在文件头。9.4.4
24、 文件的随机访问(选读)文件的随机访问(选读)文件的随机访问:文件的随机访问:在在C+C+中可以由程序控制文件指针的移动,从而实现文件的中可以由程序控制文件指针的移动,从而实现文件的随机访问随机访问,即可,即可读写流中任意一段内容读写流中任意一段内容。一般文本文件很难准。一般文本文件很难准确定位,所以随机访问多用于二进制文件。确定位,所以随机访问多用于二进制文件。如【例如【例9.99.9】中对象中两个字符串是按实际串长存放的,不是按】中对象中两个字符串是按实际串长存放的,不是按数组元素来存放的,而【例数组元素来存放的,而【例9.109.10】中是按数组长度来存放的,】中是按数组长度来存放的,每
25、个对象数据长度固定,所以便于随机访问。每个对象数据长度固定,所以便于随机访问。在在ios类中说明了一个公有枚举类型:类中说明了一个公有枚举类型:enum seek_dirbeg=0,/文件开头文件开头cur=1,/文件指针的当前位置文件指针的当前位置end=2/文件结尾文件结尾;随机访问指针控制字:随机访问指针控制字:9.4.4 文件的随机访问(选读)文件的随机访问(选读)输入流指针控制字设置成员函数:输入流指针控制字设置成员函数:istream&istream:seekg(streampos);/指针直接定位指针直接定位istream&istream:seekg(streamoff,ios:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 流类库 输入输出 宿州 学院
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内