第七章C的输入输出流.ppt
《第七章C的输入输出流.ppt》由会员分享,可在线阅读,更多相关《第七章C的输入输出流.ppt(54页珍藏版)》请在三一办公上搜索。
1、第七章 C+的I/O流类库,7.1 C+为何建立自己的输入输出系统,C+除了完全支持C 语言的输入输出系统外,还定义了一套面向对象的输入输出系统。为什么C+还要建立自己的输入输出系统呢?C 语言的输入输出系统不支持用户自定义的对象,如:Struct my_struct int i;float f;char*str;s;对此结构类型,在C语言中下面的语句是不能接受的:printf(“%my_struct”,s);因为printf()函数只能识别系统预定义的类型,而没有办法对新的数据类型进行扩充.。用C+的输入输出系统,就可以通过重载“”运算符来解以上问题。C+的类机制允它建立一个可扩展的输入输出
2、系统,它可以通过修改和扩展来加入用户自定义类型及相应操作。,1,7.2 C+的流及流类库,7.2.1 C+的流 输入输出是一种数据传递操作,它可以看作字符序列在主机与外部介质 之间的流动。流(stream)为从源(或生产者)到目的(或消费者)的数据流的引用。流具有方向性:与输入设备(如键盘)相联系的流称为输入流;与输出设备(如屏幕)相联系的流称为输出流;与输入输出设备(如磁盘)相联系的流称为输入输出流。C+中包 含几个预定义的流:标准输入流 cin 与标准输入设备相关联标准输出流 cout 与标准输出设备相关联非缓冲型标准出错流 cerr 与标准错误输出设备相关联(非缓冲方式)缓冲型的标准出错
3、流 clog 与标准错误输出设备相关联(缓冲方式)在缺省情况下,指定的标准输出设备是显示终端,标准输入设备是键盘。在任何情况下(有时用户 把标准输出设备定向为其它设备),指定的标准错误输出设备总是显示终端。cerr“The average cannot be computed.n”;,2,7.2.2 流类库,C+流类库是用继承方法建立起来的一个输入输出类库。它具有两个平行的基类:streambuf 类,ios 类。所有其它的流类都是从它们直接或间接地派生出来的。使用C+的流类库,程序中可能应包含的头文件:iostream.h strstream.h fstream.h iomanip.h1.s
4、treambuf 类,streambuf,filebuf,strstreambuf,conbuf,派生,3,2.ios 类,ios,fstreambase,strstreambase,ostream,istream,istrstream,ofstream,ostrstream,constream,ifstream,fstream,istream_withassign,ostream_withassign,iostream_withassign,strstream,iostream,4,7.3输入输出的格式控制,7.3.1 用ios 类的成员函数进行格式控制 ios类中有几个成员函数可以用来对输
5、入输出进行格式控制。主要控制 状态标志字、域 宽、填充字符及输出精度。1.状态标志字 状态标志存放在数据成员 long x_flags 中。ios 类 public 中定义了一个枚举,它的每个成员可以分别定义状标志字的一个位,每一位都称为一个状标志位。,5,.,这个枚举 定义 如下:enum 0000 0000 0000 0001skipws=0 x0001,跳过输入中的空白,可用于输入left=0 x0002,左对齐输出,可用于输出right=0 x0004,右对齐输出,可用于输出internal=0 x0008,在符号位和基指示符后填入字符,可用于输出dec=0 x0010,转换基数为十进
6、制,可用于输入或输出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 x20
7、00,在输出操作后立即刷新所有流,可用于输出 stdio=0 x4000,在输出操作后刷新stdout 和stderr,可用于输出;,6,2,x_flags取以上枚举值的并存,即x_flags上的每一位(长整数为16位)中的0 1相当于一个枚举值。例如 x_flags 中放 0 x0011 或 17即为 0000 0000 0001 0001 相当于 0 x0001 与 0 x0010 之并 skipws(0 x0001)0000 0000 0000 0001 dec(0 x0010)+0000 0000 0001 0000 x_flags(0 x0011)0000 0000 0001 000
8、1,7,2.ios类中用于控制输入输出格式的成员函数 函数原型 功能long ios:setf(long flags);设置状态标志flagslong ios:unsetf(long flags);清除状态标志,并返回前标志long ios:flags();测试状态标志long ios:flags(long flags);设置标志flags,并返回前标志int ios:width();返回当前的宽度设置值int ios:width(int w);设置域宽w,返回以前的设置int ios:precision(int p);设置小数位数p返回以前的小数位数char ios:fill();返回当前的
9、填充字符char ios:fill(char ch);设置填充字符ch返回当前的填充字符,8,(1)设置状态标志,设置状态标志,即是将某一状态标志位置“1”,可使用setf()函数其一般的调用格式为:流对象.setf(ios:状态标志);例7.1#includemain()istream cin;/对象cin可不定义 ostream cout;/对象cout可不定义 cin.setf(ios:shipws);/键盘输入时跳过输入空白 cout.setf(ios:left);/设置输出左对齐cout.setf(ios:showpos|ios:sciengific);/中间用运算符“|”分隔 co
10、ut567“”567.89endl;设置showpos使得每个正数前添加“+”号,设置sciengific使 浮点数按科学表示法(指数形式)进行显示,输出结果:+567+5.678900e02注意:要设置多项标志时,中间用或运算符“|”分隔。,9,(2)清除状态标志,清除某一状态标志,即是将某一状态标志位置”0”,可使用unseft()函数,使用时的调用格式与setf()相同。(3)取状态标志 取一个状态标志,可使用 flags()函数。flags()函数有不带参数与带 参数两 种形式:ling ios:flags();用于返回当前的状态 标志字;ling ios:flags(liog fla
11、g);返回当前的状态 标志字后,再者将状态标志字设置成flag(参数)。flags(liog flag)函数与setf(liog flags)函数的差别在于:setf()函数是在原有的基础上追加设定的,而flags()函数是用 新设定覆盖以前的状态标志字。例 7.2 几个成员函数的使用 方法#include void showflags(long f)/输出状态标志字函数 long i;for(i=0 x8000;i;i=i1)/用右移方法使i中的值为”1”的位不断右移 if(i,10,接1 例 7.2,void main()long f;cout.setf(ios:unitbuf|ios:s
12、kipws);f=cout.flags();/取当前状态标志字 showflags(f);/显示状态标志字 cout.setf(ios:showpos|ios:scientific);/追加状态 标志位 f=cout.flags();showflags(f);cout.unsetf(ios:scientific);/从状态标志字中去掉sciengific f=cout.flags();showflags(f);f=cout.flags(ios:oct);/重新设置状态标志字 showflags(f);/显示设置前的状态标志字 f=cout.flags();/取设置 后的状态标志字 showfl
13、ags(f);/显示设置后的状态标志字,11,程序运行结果为;0010000000000001(1)0010110000000001(2)0010010000000001(3)0010010000000001(4)0000000000100000(5),(4)设置域宽,域宽主要用来控制输出,在ios 类中域 宽存放在数据成员int x_width中,设置域宽的成员函数有两个,其一般格式为:int ios:width();返回当的域宽值 int ios:width(int w);设置域宽,并返回原来的域 宽(5)设置输出的精度 精度用来控制浮点数的输出显示精度,在ios类中用数据成员int x_
14、precision来存放精度,设置精度的成员函数的一般格式为:int ios:precision(int p);重新设置浮点数所需小数的位数,并返回设置前的位数(6)填充字符 填充字符的作用是:当输出值不满域宽时用填充字符来填充,缺省情况下填充字符为空格,所以在使用填充字符函数时,必须与width()函数相配合,否则就没有意义,在ios类中用数据成员x_fill来存放填充字符。填充字符的成员函数有两个,其一般形式为:char ios:fill();返回当的填充字符 char ios:fill(char ch);用ch重新设置填充字符,并返回设置前的填充字符。,12,例 7.3,#include
15、 void main()cout”x_width=”cout.width()endl;cout”x_fill=”cout.fill()endl;cout”x_precision=”cout.precision()endl;cout123”“123.45678endl;cout”-n”;cout”*x_width=10,x_fill=,x_precision=7*n”;cout.width(10);cout.precision(7);cout123”“123.45678”“234.567endl;cout”x_width=”cout.width()endl;cout”x_fill=”cout.f
16、ill()endl;cout”x_precision=”cout.precision()endl;cout”-n”;cout”*x_width=10,x_fill=,13,接1 例 7.3,cout.fill(,14,程序运行结果如下:x_width=0 x_fill=x_precision=0123123.45678-*x_width=10,x_fill=,x_preciosion=7*123 123.4568 234.567x_width=0 x_fill=x_precision=7-*x_width=10,x_fill=&,x_precision=4*&123 123.4568123&1
17、23.4568x_width=0 x_fill=&x_precision=4,例7.4 利用控制输入输出格式的成员函数建立对齐的数字表,#include#includevoid main()double x;cout.precision(4);cout”x sqrt(x)x2nn”;for(x=1.0;x=20.0;x+)cout.width(8);coutx;cout.width(8);coutsqrt(x);cout.width(8);coutx*xn;,这程序建立了如下的表 x sqrt(x)x2 1 1 1 2 1.4142 4 3 1.7321 9 4 2 16 5 2.2361 2
18、5 6 2.4495 36 7 2.6458 49 8 2.8284 64 9 3 8110 3.1623 100 11 3.3166 12112 3.4641 14413 3.6056 16914 3.7417 19615 3.873 22516 4 25617 4.1231 28918 4.2426 32419 4.3598 36120 4.4721 400,15,7.3.2使用操作符进行输入输出格式控制,C+提供了另一种进行I/O格式控制的方法,这一方法使用了一种称为操纵符(也称为操纵函数)的特殊函数。在很多情况下,使用操纵符进行格式化控制比用ios格式标志和成员函数要方便。1.C+预定
19、义的操纵符 C+预定义的操纵符是以一个流引用作为其参数,并返回同一流的引用,因此它可以嵌入到输入输出操作的链中。操纵符可用来改变域宽,使整型数以八进制或十六进制形式输入或输出,并设置填充字符等。许多操纵符的功能类似于上面介绍的ios类成员函数的功能。C+提供的预定义操纵符如下:(1)dec 以十进制形式输入或输出整型数,可用于输入或输出。(2)hex 以十六进制形式输入或输出整型数,可用于输入或输出。(3)oct 以八进制形式输入或输出整型数,可用于输入或输出。(4)ws 用于在输入时跳过开头的空白符,仅用于输入。(5)endl 插入一个换行符并刷新输出流,仅用于输出。(6)ends 插入一个
20、空字符,通常用来结束一个字符串,仅用于输出。(7)flush 刷新一个输出流,仅用于输出。(8)setbase(int n)把转换基数设置为n(n的值为0,8,10,或16),n的缺省值为”0”,即以十进制形式输出。,16,(9)resetiosflags(long f)关闭由参数 f 指定的格式标志,可用于输入或输出。(10)setiosflags(long f)设置由参数 f 指定的格式标志,可用于输入或输出。(11)setfill(int c)c 为填充字符,缺省时为空格,可用于输入或输出。(12)setprecision(int n)设置数据小数部分的位数,缺省时小数的位数为6,可用输
21、入输出。(13)setw(int n)设置域宽为n,可用于输入或输出。,17,操纵符setiosflags()和resetiosflags()中所用的格式标志,格式标志名 含 义ios:left 输出数据按域宽左对齐输出ios:right 输出数据按域宽右对齐输出ios:scientific 使用科学计数法表示浮点数ios:fixed 使用定点形式表示浮点数ios:dec 转换基数为十进制形式ios:hex 转换基数为十六进制形式ios:oct 转换基数为八进制形式ios:uppercase 十六进制形式和科学计数法输出时,表示数值的字 符 一律为大写ios:showbase 输出带有一个表示
22、制式的字符(如”X”表示十六进 制,”O”表示八进制)ios:showpos 在正数前添加一个”+”号ios:showpoint 浮点输出时必须带有一个小数点2.操纵符的使用 操纵符分为带参数的操纵符和不带参数的操纵符.通常,不带参数的操纵符在iostream.h 文件中定义,带参数的操纵符在 iomanip.h 文件中定义。,18,例7.5 使用操纵符的输入输出格式控制,#include#include void main()cout setw(10)123567endl;/cout123setiosflags(ios:scientific)setw(20)123.456789endl;/c
23、out 123setw(10)hex123endl;/cout 123setw(10)oct(8)123endl;/cout 123setw(10)setbase(0)123endl;/coutresetiosflags(ios:scientific)setprecision(4)123.456789endl;coutsetiosflags(ios:left)setfill(#)setw(8)123endl;/coutresetiosflags(ios:left)setfill($)setw(8)456endl;/,19,程序运行结果为:1234567123 1.234567e+02123 7
24、b7b 173 173 123 123.4568123#$456,例7.6 二次方表与二次方根表的程序的程序的另一个版本,#include#include#includevoid main()double x;coutsetprecision(4);cout“x sqrt(x)x2nn”;for(x=1.;x=20.0;x+);cout setw(8)x;cout setw(8)sqrt(x);cout setw(8)x*xn;,20,3.用户自定义的操纵符,C+除了提供此同预定义的操纵符外,也允许用户自定义操纵符,把程序中频繁使用的输入输出操作合并成一个操纵符。若为输出流定义操纵符函数,则定
25、义形式如下:ostream,21,例 7.7 自定义的操纵符,#include#includeostream 程序运行结果如下:1237b&,22,例 7.8,#include#includeistream 以上程序中定义了一个操纵符函数input1,该函数要求输入一个十六进制数。程序运行后,屏幕上显示:Enter number using hex format:提示用户输入一个十六进制数。,23,7.4用户自定义类型的输入输出,用户自定义的类型数据的输入或输出,可以通过重载运算符“”和“”和“”可以直接用来输入或输出类的对象。7.4.1 重载输出运算符“”定义输出运算符”重载函数的一般格式如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 输入输出
链接地址:https://www.31ppt.com/p-5956914.html