《第十一章IO流与文件系统》由会员分享,可在线阅读,更多相关《第十一章IO流与文件系统(19页珍藏版)》请在金锄头文库上搜索。
1、第十一章第十一章 IO流与文件系统流与文件系统丘志杰丘志杰电子科技大学电子科技大学计算机学院计算机学院 软件学院软件学院面向对象程序设计语言C+uI/O系统的作用系统的作用应用程序应用程序I/O系统系统磁磁盘盘键盘键盘显示器显示器文件文件文件文件I/O系统为程序与系统为程序与I/O设备之间进行数据交互设备之间进行数据交互提供了途径。提供了途径。2024/8/262024/8/262 2电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+C+为何有自己的为何有自己的I/O系统系统uC语言的标准输入输出函数和只能处理基本语言的标准输入输出函数和只能处理基本数据类型
2、,对用户自定义类型无能为力。数据类型,对用户自定义类型无能为力。uC+可以重载输入输出运算符,能够处理用可以重载输入输出运算符,能够处理用户自定义类型。户自定义类型。uC+采用继承方式来设计流库,功能更强大,采用继承方式来设计流库,功能更强大,扩充性更好。扩充性更好。2024/8/262024/8/263 3电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+C+流库的结构流库的结构uuC+流流库库是是从从继继承承方方法法建建立立起起来来的的一一个个输输入入/输输出出类类库库,它它具具有有两两个个平平行行的的基基类类,即即streambuf类类和和ios类类,
3、所所有有其其他他的的流流类类都是从它们直接或间接地派生出来的。都是从它们直接或间接地派生出来的。uustreambuf类提供对缓冲区的低级操作:类提供对缓冲区的低级操作:streambufstreambuffilebuffilebufstrstreambufstrstreambufconbufconbuf2024/8/262024/8/264 4电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+uios类类及及其其派派生生类类提提供供用用户户使使用用流流类类的的接接口口:iosiosistreamistreamostreamostreamfstreambas
4、efstreambasestrstreambasestrstreambaseifstreamifstream istrstreamistrstreamofstreamofstream ostrstreamostrstream constreamconstreamfstreamfstreamstrstreamstrstreamiostreamiostreamistream-withassignistream-withassignostream-withassignostream-withassigniostream-withassigniostream-withassign2024/8/2620
5、24/8/265 5电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+有关头文件和预定义流对象有关头文件和预定义流对象u包含常用流类声明的头文件:包含常用流类声明的头文件:iostream.h支持标准支持标准I/0操作操作fstream.h 支持文件支持文件I/0操作操作strstream.h 支持串支持串I/0操作操作iomanip.h支持大多数流操纵符支持大多数流操纵符u当开始执行当开始执行C+程序时,有几个自动打程序时,有几个自动打开的预定义流:开的预定义流:cin标准输入标准输入cout标准输出标准输出cerr不带缓冲标准出错信息输出不带缓冲标准出错
6、信息输出clog带缓冲标准出错信息输出带缓冲标准出错信息输出2024/8/262024/8/266 6电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+输入和输出输入和输出uistream和和ostream是用户使用流库的是用户使用流库的主要界面之一。主要界面之一。uistream提供了主要的输入操作,可以通提供了主要的输入操作,可以通过过istream完成如下操作:完成如下操作:从输入流中获取单个字符。从输入流中获取单个字符。从输入流中获取一行数据。从输入流中获取一行数据。从输入流中获取指定字节数的数据。从输入流中获取指定字节数的数据。将文件指针移动到指定
7、位置,等等。将文件指针移动到指定位置,等等。2024/8/262024/8/267 7电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+uostream提供了主要的输出操作,可以提供了主要的输出操作,可以通过通过ostream完成如下操作:完成如下操作:刷新输出流。刷新输出流。向输出流中写入指定字节数的数据。向输出流中写入指定字节数的数据。将文件指针移动到指定位置,等等。将文件指针移动到指定位置,等等。uistream和和ostream分别重载了分别重载了和和两个运算符,用户可以很方便地使用两个运算符,用户可以很方便地使用这两个运算符对预定义类型进行输入和输
8、这两个运算符对预定义类型进行输入和输出。用户也可以重载这两个运算符,从而出。用户也可以重载这两个运算符,从而能够输入和输出自定义类的对象。能够输入和输出自定义类的对象。2024/8/262024/8/268 8电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+格式控制格式控制uuC+提供了两种格式控制的方法:提供了两种格式控制的方法:使用操作符使用操作符使用操作符使用操作符使用使用使用使用iosios类中实现格式控制的成员函数类中实现格式控制的成员函数类中实现格式控制的成员函数类中实现格式控制的成员函数2024/8/262024/8/269 9电子科技大学计
9、算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+使用操作函数控制格式使用操作函数控制格式uuC+ I/O流库提供了一些操作符(如下表流库提供了一些操作符(如下表所示),可以直接嵌入到输入所示),可以直接嵌入到输入/输出语句中输出语句中来实现特殊格式的控制。来实现特殊格式的控制。2024/8/262024/8/261010电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+操纵符操纵符 含义含义 I/Odec 以十进制为基以十进制为基 I/Ooct 以八进制为基以八进制为基 I/Ohex 以十六进制为基以十六进制为基 I/Ows 提取输入
10、中的空白提取输入中的空白 inputendl 插入换行并刷新流插入换行并刷新流 outputends 在串后插入终止符在串后插入终止符 outputflush 刷新流刷新流 outputsetbase(int) 设置基(设置基(0,8,10,16) outputresetiosflags(long ) 清除参数指定的格式位清除参数指定的格式位 I/Osetiosflags(long ) 设置参数指定的格式位设置参数指定的格式位 I/Osetfill(int ) 设置填充字符设置填充字符 I/Osetprecision(int) 设置显示精度设置显示精度 I/Osetw(int) 设置显示域宽设
11、置显示域宽 I/O2024/8/262024/8/261111电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+例子例子void main() int a=100; couthexaendl; coutoctaendl; coutdecaendl;/结果:结果:641441002024/8/262024/8/261212电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+使用使用ios类成员函数格式化类成员函数格式化u输入输出的格式由各种格式状态标志来确定。输入输出的格式由各种格式状态标志来确定。这些状态标志在这些状态标志在
12、状态量状态量中各占一位,它们在中各占一位,它们在ios类中定义为枚举量,如下表所示。类中定义为枚举量,如下表所示。u这些成员函数的功能包括:这些成员函数的功能包括:设置格式状态标志(设置格式状态标志(setf)清除格式状态标志(清除格式状态标志(unsetf)获取格式状态标志(获取格式状态标志(flag)设置域宽、填充字符和设置精度(设置域宽、填充字符和设置精度(width、fill、precision等)等)2024/8/262024/8/261313电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+状态标志状态标志 含义含义 I/Oskipws 跳过输入
13、中的空白跳过输入中的空白 inputleft 左对齐输出左对齐输出 outputright 右对齐输出右对齐输出 outputinternal 在引导符或基指示符后填入字符在引导符或基指示符后填入字符 outputdec 以十进制为基以十进制为基 I/Ooct 以以八进制为基八进制为基 I/Ohex 以十六进制为基以十六进制为基 I/Oshowbase 在在输出中显示基指示符输出中显示基指示符 outputshowpoint 在输出中显示小数点在输出中显示小数点 outputuppercase 十六进制输出时,字母大写十六进制输出时,字母大写 outputshowpos 正整数前显示正整数前显
14、示“+” outputscientific 科学计数法显示浮点数科学计数法显示浮点数 outputfixed 定点形式显示浮点数定点形式显示浮点数 outputunitbuf 在在输出后立即刷新所有流输出后立即刷新所有流 outputstdio 输出后刷新输出后刷新stdout和和stderr output2024/8/262024/8/261414电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+例子例子void main()int a=20;double b=111.11; cout.setf(ios:showpos|ios:scientific);co
15、utaendl;coutbendl;/结果:结果:+20+1.111100e+0022024/8/262024/8/261515电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+文件I/OuC+把文件看作是字符序列。根据数据的组把文件看作是字符序列。根据数据的组织形式,文件可分成织形式,文件可分成ASCII文件和二进制文文件和二进制文件两种。件两种。uASCII文件又称为文本文件,它的每一个字文件又称为文本文件,它的每一个字节放一个节放一个ASCII代码,代表一个字符,这样代码,代表一个字符,这样便于对字符进行处理,也便于输出,但占用便于对字符进行处理,也便
16、于输出,但占用存储空间较多。存储空间较多。u二进制文件是把内存的数据,按其在内存中二进制文件是把内存的数据,按其在内存中的存储形式原样写到磁盘上。用二进制形式的存储形式原样写到磁盘上。用二进制形式输出数据,可节省外存空间和转换时间,但输出数据,可节省外存空间和转换时间,但一个字节并不对应一个字符。一般,中间结一个字节并不对应一个字符。一般,中间结果常用二进制文件保存,以减少外存开销。果常用二进制文件保存,以减少外存开销。2024/8/262024/8/261616电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+C+中进行文件中进行文件I/O的基本过程的基本
17、过程u在在C+中,要进行文件的中,要进行文件的I/O,必须首先,必须首先创建一个流,然后将这个流与文件相关联,创建一个流,然后将这个流与文件相关联,即打开文件,此时才能进行读即打开文件,此时才能进行读/写操作,完写操作,完成后再关闭这个文件。成后再关闭这个文件。2024/8/262024/8/261717电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+文件的打开和关闭文件的打开和关闭uC+有三种类型的文件流:输入文件有三种类型的文件流:输入文件ifstream,输出文件流,输出文件流ofstream,输入,输入/输出文件流输出文件流fstream。这些文件
18、流都定义在。这些文件流都定义在fstream.h中。中。u要执行文件输入要执行文件输入/输出,须做三件事:输出,须做三件事:在程序中要包含头文件在程序中要包含头文件fstream.h建立流。建立流的过程就是定义流类的对象。建立流。建立流的过程就是定义流类的对象。使用使用open()函数打开文件,也就是使某一文件函数打开文件,也就是使某一文件与上面的某一流相联系。与上面的某一流相联系。2024/8/262024/8/261818电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院面向对象程序设计语言C+举例举例#include #include #include #include vo
19、id main()void main() char buf32;char buf32; ifstreamifstream in; in;memset(buf,0,sizeof(buf);memset(buf,0,sizeof(buf);in.open(c:test.txt,ios:inin.open(c:test.txt,ios:in); );ininbufbuf; ;in.closein.close();(); ofstreamofstream out; out;out.open(c:test.txt,ios:outout.open(c:test.txt,ios:out); );strcat(buf,123456789);strcat(buf,123456789);outoutbufbuf; ;out.closeout.close();(); 2024/8/262024/8/261919电子科技大学计算机学院电子科技大学计算机学院 软件学院软件学院