第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; / 预定义代表标准输出
5、设备显示器 extern istream_withassign cerr; / 预定义代表标准出错输出设备显示器 extern istream_withassign clog; / 预定义代表标准出错输出设备显示器。,说明,这四个标准流对象是程序中进行标准输入输出要用到的。 cin对象是从标准输入设备(键盘)输入到内存的数据流,称为cin流或标准输入流。 cout对象是从内存输入到标准输出设备(显示器)的数据流,称为cout流或标准输出流。 cerr和clog均为向输出设备(显示器)输出出错信息。,132 格式化I/O 在很多情况下,程序员需要控制输入输出格式。 C+提供了两种格式控制方法:
6、使用ios类中有关格式控制的成员函数; 使用称为控制符的特殊类型的函数。 1321 用ios类的成员函数进行格式控制 ios类中有几个成员函数可以用来对输入输出进行格式控制。进行格式控制主要是通过对格式状态字、域宽、填充字符以及输出精度的操作来完成的。,1格式状态字 C+可以给每个流对象的输入输出进行格式控制,以满足程序员对输入输出格式的需求。 输入输出格式由一个long int类型的格式状态字确定,状态字的各位都控制一定的输入输出特征。 在ios类的public部分定义了一个枚举,它的每个成员可以分别定义格式状态字的一个位,每一个位称为一个状态标志位。这个枚举的定义如下: enum skip
7、ws = 0x0001, left = 0x0002, right = 0x0004, internal = 0x0008, dec = 0x0010, oct = 0x0020, hex = 0x0040,showbase = 0x0080, showpoint = 0x0100, uppercase = 0x0200, showpos = 0x0400, scientific = 0x0800, fixed = 0x1000, unitbuf = 0x2000, stdio = 0x4000 ;,2ios类中用于控制输入输出格式的成员函数 在ios类的说明中,定义了几个用于格式控制的公有成
8、员函数,列举如下: long ios:flags(); / 返回当前格式状态字 long ios:flags(long): / 设置格式状态字并返回 long ios:setf(long); / 设置指定的标志位 long ios:unsetf(long); / 清除指定的标志位 int ios:width(); / 返回当前显示数据的域宽 int ios:width(int); / 设置当前显示数据域宽并返回原域宽 char ios:fill(); / 返回当前填充字符 char ios:fill(char); / 设置填充字符并返回原填充字符 int ios:precision(); /
9、返回当前浮点数的精度 int ios:precision(int); / 设置浮点数精度并返回原精度,例13-1 格式状态字的设置和清除 #include using namespace std; int main() long f; int i; double x; i=200; x=53.6; f=cout.flags(); / 取当前格式状态字 cout“The flags is “fendl; / The flags is 513 cout“i=“i“,x=“xendl; / i=200,x=53.6 cout.unsetf(ios:dec); / 终止十进制的格式设置 cout.se
10、tf(ios:hex|ios:showbase); / 设置以十六进制输出并显示基数符号 cout.setf(ios:scientific); / 指定科学记数法输出 cout“i=“i“,x=“xendl; / i=0xc8,x=5.360000e+001 cout.setf(ios:uppercase); / 输出字母时以大写显示 cout“i=“i“,x=“xendl; / i=0XC8,x=5.360000E+001 return 0; ,例13-2 域宽和填充字符的设置 #include using namespace std; int main() int i; double x,
11、y; i=100; x=23.14159; y=23.575; cout“Default width is “cout.width()endl; cout“Default fill is “cout.fill()endl; cout“Default precision is “cout.precision()endl; couti“ “x“ “yendl; cout.width(10); couti“ “x“ “yendl; cout.precision(4); couti“ “x“ “yendl; cout.fill(*); cout.width(10); couti“ “x“ “yendl
12、; return 0; ,程序运行结果为: Default width is 0 Default fill is Default precision is 6 100 23.1416 23.575 100 23.1416 23.575 100 23.14 23.57 *100 23.14 23.57,1322 使用I/O操纵符进行格式控制 使用ios类的成员函数进行输入输出格式控制时,每个函数的调用需要写一条语句,而且不能将它们直接嵌入到输入输出语句中,使人感到不够简洁、方便。 C+提供另一种进行输入输出格式控制的方法,这一方法使用一种称为操纵符的特殊函数。在很多情况下,使用操纵符进行格式化控
13、制比用ios格式标志和成员函数要方便。 C+预定义的操纵符分为带参数的操纵符和不带参数的操纵符。通常,不带参数的操纵符在iostream文件中定义,而带参数的操纵符在iomanip文件中定义。 在进行输入输出时,操纵符被嵌入到输入或输出链中,用来控制输入输出格式,而不执行输入或输出操作。,定义在iostream头文件中的操纵符有: endl 输出时插入换行符并刷新流 ends 输出时在字符串后插入空字符(NULL)作为尾符 flush 刷新,把流从缓冲区输出到目标设备 ws 输入时略去空白字符 dec 以十进制形式输入或输出整型数 hex 以十六进制形式输入或输出整型数 oct 以八进制形式输
14、入或输出整型数,定义在iomanip头文件中的操纵符有: setbase(int n) 设置转换基数为n(n取值为0、8、10或16),缺省时为0,表示采用十进制形式输出 resetiosflags(long f) 清除由参数f指定的标志位,用于输入输出 setiosflags(long f) 设置参数f指定的标志位 setfill(char c) 设置填充字符 setprecision(int n) 设置浮点数精度(缺省为6) setw(int n) 设置数据宽度 程序中如果使用带参数的操纵符,还必须使用预编译命令: include 将需要的头文件包含进来。,例13-3 操纵符的使用 #in
15、clude #include using namespace std; int main() int i; couti; cout“Dec: “i endl; / 以十进制形式输出 cout“Oct: “octiendl; / 以八进制形式输出 cout“Hex: “setbase(16)iendl; / 以十六进制输出 coutdecsetw(8)123456endl; cout123.4567“ “setiosflags(ios:scientific)123.456endl; coutsetfill(*)setw(10)123endl; coutsetiosflags(ios:left)s
16、etfill(#)setw(10)123endl; coutresetiosflags(ios:left)setfill($)setw(10)123endl; return 0; ,程序的运行情况如下: Input i :100 Dec: 100 Oct: 144 Hex: 64 123456 123.457 1.234560e+002 *123 123# $123,13.3 重载I/O运算符,C+创建自己的流库的主要目的,就是用户自定义类型数据的输入输出也能像系统预定义类型数据的输入输出一样简单、方便,这是通过重载输入运算符“”和输出运算符“”来实现的。,13.3.1 重载输出运算符“”,一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 IO 流类库
链接地址:https://www.31doc.com/p-3420323.html