第13章C的IO流类库.ppt
《第13章C的IO流类库.ppt》由会员分享,可在线阅读,更多相关《第13章C的IO流类库.ppt(45页珍藏版)》请在三一办公上搜索。
1、第13章 C+的I/O流类库,13.1 C+的流及流类库,13.1.1 C+的流 输入和输出是数据传送的过程,数据如流水从一处流向另一处。C+形象地将此过程称为流(stream)。C+的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一个对象。流表示了信息从源到目的端的流动。,1)输入流 在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存,称为输入流。2)输出流在输出操作时,字节流从内存流向输出设备(如显示器、打印机、磁盘等),称为输出流。,流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其它形式的信息。,3)输入输出流的本质,实际
2、上,在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。当用cout和插入运算符“”从输入缓冲区中提取数据送给程序中的有关变量。,4)流类,在C+中,输入输出流被定义为类。C+的IO库中的类称为流类(stream class)。用流类定义的对象称为流对象。例如 cin和cout就是iostream_withassign类的对象。,13.1.2 流类库,C+流库是C+语言为完成输入/输出工作而预定义的类的集合。C+的IO流类库是用继承方法建立起来的一个输入输出类库,这些类构成一个层次结构的系统。它具有两个平行类:即streambuf类和ios类,这两个类是基本类,所有的流类都可以由它们
3、派生出来。,1.streambuf类,streambuf类提供物理设备的接口,它提供缓冲或处理流的通用方法,几乎不需要任何格式。缓冲区由一个字符序列和两个指针组成,这两个指针是输入缓冲区指针和输出缓冲区指针,它们分别指向字符要被插入或取出的位置。streambuf类提供对缓冲区的低级操作,如设置缓冲区、对缓冲区指针进行操作、从缓冲区取字符、向缓冲区存储字符。,streambuf有三个派生类,即filebuf、strstreambuf和conbuf,其成员函数大多采用内置函数方式定义,以提高效率。下图为它们之间的层次关系。,2.ios类,ios类是一个虚基类,它主要定义了用于格式化输入输出及出错
4、的成员函数。在ios类和它的各级派生类中,均含有一个指向流缓冲类streambuf的对象的指针。Ios类(及其派生类)使用streanbuf类以及它派生的文件缓冲类filebuf和字符缓冲类strstreambuf进行输入输出。常用iso流类的简要说明和类声明所在的头文件名见书第373页表13.1。,ios流类层次图,在头文件iostream.h中,提供了4个预定义的标准流对象:extern istream_withassign cin;/预定义代表标准输入设备键盘extern ostream_withassign cout;/预定义代表标准输出设备显示器extern istream_with
5、assign cerr;/预定义代表标准出错输出设备显示器extern istream_withassign clog;/预定义代表标准出错输出设备显示器。,说明,这四个标准流对象是程序中进行标准输入输出要用到的。cin对象是从标准输入设备(键盘)输入到内存的数据流,称为cin流或标准输入流。cout对象是从内存输入到标准输出设备(显示器)的数据流,称为cout流或标准输出流。cerr和clog均为向输出设备(显示器)输出出错信息。,132 格式化I/O 在很多情况下,程序员需要控制输入输出格式。C+提供了两种格式控制方法:使用ios类中有关格式控制的成员函数;使用称为控制符的特殊类型的函数。
6、1321 用ios类的成员函数进行格式控制 ios类中有几个成员函数可以用来对输入输出进行格式控制。进行格式控制主要是通过对格式状态字、域宽、填充字符以及输出精度的操作来完成的。,1格式状态字 C+可以给每个流对象的输入输出进行格式控制,以满足程序员对输入输出格式的需求。输入输出格式由一个long int类型的格式状态字确定,状态字的各位都控制一定的输入输出特征。在ios类的public部分定义了一个枚举,它的每个成员可以分别定义格式状态字的一个位,每一个位称为一个状态标志位。这个枚举的定义如下:enum skipws=0 x0001,left=0 x0002,right=0 x0004,in
7、ternal=0 x0008,dec=0 x0010,oct=0 x0020,hex=0 x0040,showbase=0 x0080,showpoint=0 x0100,uppercase=0 x0200,showpos=0 x0400,scientific=0 x0800,fixed=0 x1000,unitbuf=0 x2000,stdio=0 x4000;,2ios类中用于控制输入输出格式的成员函数 在ios类的说明中,定义了几个用于格式控制的公有成员函数,列举如下:long ios:flags();/返回当前格式状态字long ios:flags(long):/设置格式状态字并返回l
8、ong ios:setf(long);/设置指定的标志位long ios:unsetf(long);/清除指定的标志位int ios:width();/返回当前显示数据的域宽int ios:width(int);/设置当前显示数据域宽并返回原域宽char ios:fill();/返回当前填充字符char ios:fill(char);/设置填充字符并返回原填充字符int ios:precision();/返回当前浮点数的精度int ios:precision(int);/设置浮点数精度并返回原精度,例13-1 格式状态字的设置和清除#include using namespace std;in
9、t main()long f;int i;double x;i=200;x=53.6;f=cout.flags();/取当前格式状态字 coutThe flags is fendl;/The flags is 513 couti=i,x=xendl;/i=200,x=53.6 cout.unsetf(ios:dec);/终止十进制的格式设置 cout.setf(ios:hex|ios:showbase);/设置以十六进制输出并显示基数符号 cout.setf(ios:scientific);/指定科学记数法输出 couti=i,x=xendl;/i=0 xc8,x=5.360000e+001
10、cout.setf(ios:uppercase);/输出字母时以大写显示 couti=i,x=xendl;/i=0XC8,x=5.360000E+001 return 0;,例13-2 域宽和填充字符的设置#include using namespace std;int main()int i;double x,y;i=100;x=23.14159;y=23.575;coutDefault width is cout.width()endl;coutDefault fill is cout.fill()endl;coutDefault precision is cout.precision()
11、endl;couti x yendl;cout.width(10);couti x yendl;cout.precision(4);couti x yendl;cout.fill(*);cout.width(10);couti x yendl;return 0;,程序运行结果为:Default width is 0Default fill isDefault precision is 6100 23.1416 23.575 100 23.1416 23.575100 23.14 23.57*100 23.14 23.57,1322 使用I/O操纵符进行格式控制 使用ios类的成员函数进行输入输
12、出格式控制时,每个函数的调用需要写一条语句,而且不能将它们直接嵌入到输入输出语句中,使人感到不够简洁、方便。C+提供另一种进行输入输出格式控制的方法,这一方法使用一种称为操纵符的特殊函数。在很多情况下,使用操纵符进行格式化控制比用ios格式标志和成员函数要方便。C+预定义的操纵符分为带参数的操纵符和不带参数的操纵符。通常,不带参数的操纵符在iostream文件中定义,而带参数的操纵符在iomanip文件中定义。在进行输入输出时,操纵符被嵌入到输入或输出链中,用来控制输入输出格式,而不执行输入或输出操作。,定义在iostream头文件中的操纵符有:endl 输出时插入换行符并刷新流 ends 输
13、出时在字符串后插入空字符(NULL)作为尾符 flush 刷新,把流从缓冲区输出到目标设备 ws 输入时略去空白字符 dec 以十进制形式输入或输出整型数 hex 以十六进制形式输入或输出整型数 oct 以八进制形式输入或输出整型数,定义在iomanip头文件中的操纵符有:setbase(int n)设置转换基数为n(n取值为0、8、10或16),缺省时为0,表示采用十进制形式输出 resetiosflags(long f)清除由参数f指定的标志位,用于输入输出 setiosflags(long f)设置参数f指定的标志位 setfill(char c)设置填充字符 setprecision(
14、int n)设置浮点数精度(缺省为6)setw(int n)设置数据宽度 程序中如果使用带参数的操纵符,还必须使用预编译命令:include 将需要的头文件包含进来。,例13-3 操纵符的使用#include#include using namespace std;int main()int i;couti;coutDec:i endl;/以十进制形式输出 coutOct:octiendl;/以八进制形式输出 coutHex:setbase(16)iendl;/以十六进制输出 coutdecsetw(8)123456endl;cout123.4567 setiosflags(ios:scien
15、tific)123.456endl;coutsetfill(*)setw(10)123endl;coutsetiosflags(ios:left)setfill(#)setw(10)123endl;coutresetiosflags(ios:left)setfill($)setw(10)123endl;return 0;,程序的运行情况如下:Input i:100Dec:100Oct:144Hex:64 123456123.457 1.234560e+002*123123#$123,13.3 重载I/O运算符,C+创建自己的流库的主要目的,就是用户自定义类型数据的输入输出也能像系统预定义类型数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 IO 流类库

链接地址:https://www.31ppt.com/p-5891624.html