c++教程 第七章_第1页
c++教程 第七章_第2页
c++教程 第七章_第3页
c++教程 第七章_第4页
c++教程 第七章_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 C+C+的的 I/0 I/0 流类库流类库 第7章 C+的I/O流类库 7 71 c1 c十十为何建立自己的输入输出系统十十为何建立自己的输入输出系统7 72 c2 c十十的流及流类库十十的流及流类库7 73 3 输入输出的格式控制输入输出的格式控制7 74 4 用户自定义类型的输入输出用户自定义类型的输入输出7.5 7.5 文件的输入输出文件的输入输出7 76 6 应用举例应用举例第7章 C+C+的的 I/0 I/0 流类库流类库 7 71 C+1 C+为何建立自己的输入输出系统为何建立自己的输入输出系统 在在c c十十中需要定义众多的用户自定义类型,但十十中需要定义众多的用户自定义

2、类型,但c c语言语言的输入输出系统不支持用户自定义的对象。的输入输出系统不支持用户自定义的对象。 structstruct my_structmy_struct intint i; i; float f; float f; char char strstr; ; s; s; 下面的语句是不能接受的下面的语句是不能接受的: : printf(%my_structprintf(%my_struct ,s);s); 使用使用C C十十的输入输出系统,就可以通过重载十十的输入输出系统,就可以通过重载运算符来解决以上问题。运算符来解决以上问题。C C十十的类机制允许它建立一十十的类机制允许它建立一个可

3、扩展的输入输出系统,它可以通过修改和扩展来加入个可扩展的输入输出系统,它可以通过修改和扩展来加入用户自定义类型及相应操作。用户自定义类型及相应操作。第7章 C+C+的的 I/0 I/0 流类库流类库 7 72 c2 c十十的流及流类库十十的流及流类库7.2.l C7.2.l C十十的流十十的流 输入输出是一种数据传递操作,它可以看作字符序输入输出是一种数据传递操作,它可以看作字符序列在主机与外部介质之间的流动。流列在主机与外部介质之间的流动。流( (stream)stream)为从源为从源到目的的数据流的引用。每个流都是一种与设备相联系到目的的数据流的引用。每个流都是一种与设备相联系的对象。流

4、具有方向性的对象。流具有方向性. C. C十十的流十十的流 与输入设备与输入设备( (如键盘如键盘) )相联系的流称为输入流相联系的流称为输入流; ; 与输出设备与输出设备( (屏幕屏幕) )相联系的流称为输出流相联系的流称为输出流; ; 与输入输出设备与输入输出设备( (如磁盘如磁盘) )相联系的流称为输入输出流。相联系的流称为输入输出流。第7章 C+C+的的 I/0 I/0 流类库流类库 . . 四个预定义流及所关联的具体设备:四个预定义流及所关联的具体设备: (1)(1)标准输入流标准输入流cincin : : 与标准输入设备相关联与标准输入设备相关联; ; (2)(2)标准输出流标准输

5、出流coutcout : :与标准输出设备相关联与标准输出设备相关联; ; (3)(3)非缓冲型的标准出错流非缓冲型的标准出错流cerrcerr : :与标准错误输出设备相关联与标准错误输出设备相关联; ; (4)(4)缓冲型的标准出错流缓冲型的标准出错流clogclog : :与标准错误输出设备相关联与标准错误输出设备相关联. . 指定的标准错误输出设备总是显示终端。指定的标准错误输出设备总是显示终端。 cerrcerr和和clogclog之间的区别是之间的区别是: :cerrcerr没有被缓冲,因而发送给它的没有被缓冲,因而发送给它的任何内容都立即输出任何内容都立即输出; ;相反,相反,c

6、logclog被缓冲,当缓冲区满时才进被缓冲,当缓冲区满时才进行输出,也可以通过刷新流的方式强迫刷新缓冲区。行输出,也可以通过刷新流的方式强迫刷新缓冲区。 在程序中,也可以把错误信息送到在程序中,也可以把错误信息送到coutcout。但当用户把标准输。但当用户把标准输出设备定向为其它设备时,出设备定向为其它设备时,cerrcerr仍然把信息送给显示终端,以仍然把信息送给显示终端,以便用户能立即看到该信息。便用户能立即看到该信息。第7章 C+C+的的 I/0 I/0 流类库流类库 7.2.2 7.2.2流类库流类库两个基类两个基类: : streambufstreambuf类和类和iosios类

7、类。 1.streambuf1.streambuf类类 (1)(1)用作流类库的其它部分使用的基类用作流类库的其它部分使用的基类 提供对缓冲区的低级操作,如设置缓冲区、对缓冲区指针提供对缓冲区的低级操作,如设置缓冲区、对缓冲区指针进行操作、从缓冲区取字符、向缓冲区存储字符等。进行操作、从缓冲区取字符、向缓冲区存储字符等。 (2)(2) 派生出三个类:派生出三个类: filebuffilebuf类类使用文件来保存缓冲区中的字符序列。将使用文件来保存缓冲区中的字符序列。将filebuffilebuf同同某个文件的描述字相联系就称打开这个文件。、某个文件的描述字相联系就称打开这个文件。、 strst

8、reambufstrstreambuf类提供了在内存中进行提取和插入操作的缓冲类提供了在内存中进行提取和插入操作的缓冲区管理。区管理。 conbufconbuf类用于处理输出。它提供了控制光标、设置颜色、定类用于处理输出。它提供了控制光标、设置颜色、定义活动窗口、清屏、清一行等功能,为输出操作提供缓冲区管义活动窗口、清屏、清一行等功能,为输出操作提供缓冲区管理。理。第7章 C+C+的的 I/0 I/0 流类库流类库 2. 2.iosios类类 iosios类类( (及其派生类及其派生类) )使用使用streambufstreambuf及其派生类完成检查错及其派生类完成检查错误的格式化输入输出,

9、并支持对误的格式化输入输出,并支持对streambufstreambuf的缓冲区进行的缓冲区进行输入输出时的格式化或非格式化转换。输入输出时的格式化或非格式化转换。 (1) (1) 四个直接派生类:四个直接派生类: 输入流类输入流类 istreamistream 输出流类输出流类 ostreamostream 文件流类文件流类 fstreambasefstreambase 串流类串流类 strstreambasestrstreambase 第7章 C+C+的的 I/0 I/0 流类库流类库 (2)(2)各个类的继承关系各个类的继承关系: : 输入输出流类输入输出流类iostreamiostre

10、am是通过多重继承派生而来的是通过多重继承派生而来的: : class class iosios; ; class class istream:virtualistream:virtual public public iosios; ; class class ostream:virtualostream:virtual public public iosios; ; class class iostreamiostream: public stream: public stream,public public ostreamostream; ; 以以 istreamistream 、ostr

11、eamostream 、fstreambasefstreambase 和和 strstreambasestrstreambase 可可以派生出多个实用的流类以派生出多个实用的流类 . . fstreamfstream ( (输入输出输入输出 文件流类文件流类) )、strstreamstrstream ( (输入输出输入输出 串流类串流类) )、con_streamcon_stream ( (屏幕输出屏幕输出 流类流类) )、ifstreamifstream ( (输入文件流类输入文件流类) )、ofstreamofstream ( (输输 出出 文件流类文件流类) )、 istrstream

12、istrstream( (输入串流类输入串流类) )和和 ostrstreamostrstream ( (输出串流类输出串流类) )等。等。第7章 C+C+的的 I/0 I/0 流类库流类库 在在 istreamistream 类、类、ostreamostream 类和类和 iostreamiostream 类的基础上类的基础上 ,分别,分别重载赋值运算符重载赋值运算符= = ,就派生出,就派生出istream_withassignistream_withassign、ostream_withassignostream_withassign和和iostream_withassigniostre

13、am_withassign类类 在开始执行在开始执行C C十十程序时十十程序时 ,系统自动打开的预定义流,系统自动打开的预定义流 :cincin、coutcout、cerrcerr 和和 clogclog在在 iostream.hiostream.h中说明为中说明为_ _withassignwithassign类类的对象的对象 : : extreanextrean istream_withassignistream_withassign cincin; ; extreanextrean istream_withassignistream_withassign coutcout; ; extre

14、anextrean istream_withassignistream_withassign cerrcerr; ; extreanextrean istream_withassignistream_withassign clog; clog; 第7章 C+C+的的 I/0 I/0 流类库流类库 用户也可以用用户也可以用istreamistream和和ostreamostream等类声明自己的流对象,如等类声明自己的流对象,如: : istreamistream is; is; ostreamostream osos; ; 使用流类库,程序既可以识别系统预定义的使用流类库,程序既可以识别系统预

15、定义的I/OI/O类型,又类型,又可以重载运算符可以重载运算符,使程序能够识别用户定义的类,使程序能够识别用户定义的类型,大大提高程序的可靠性和灵活性。型,大大提高程序的可靠性和灵活性。第7章 C+C+的的 I/0 I/0 流类库流类库 7 73 3 输入输出的格式控制输入输出的格式控制7.3.1 7.3.1 用用iosios的成员函数进行格式控制的成员函数进行格式控制1 1状态标志字状态标志字 由一个由一个longintlongint类型的状态标志字确定。在类型的状态标志字确定。在iosios类的类的publicpublic部分定义了一个枚举,它的每个成员可以分别定义状态标志部分定义了一个枚

16、举,它的每个成员可以分别定义状态标志字的一个位,每一位都称为一个状态标志位。字的一个位,每一位都称为一个状态标志位。2 2 iosios类中用于控制输入输出格式的成员函数类中用于控制输入输出格式的成员函数 (1)(1)设置状态标志设置状态标志 long long ios:setf(longios:setf(long flags) flags)调用格式为调用格式为: : 流对象流对象 setfsetf ( ( iosios: :状态标志状态标志); ); 第7章 C+C+的的 I/0 I/0 流类库流类库 例如例如: : istreamistream isobjisobj; ; ostreamo

17、stream osobjosobj; ; isobjisobj setf(ios:skipwssetf(ios:skipws); ); / /跳过输入中的空白跳过输入中的空白 osobjosobj setf(ios:leftsetf(ios:left); ); / /设置输出左对齐设置输出左对齐例例7 71 1 #include #include main() main() coutcout setf(ios:showpossetf(ios:showpos| | ios:scientificios:scientific); ); coutcout567” ”56789567” ”56789nd

18、lndl; ; 设置设置showposshowpos使得每个正数前添加使得每个正数前添加“十十”号,号,设置设置scientificscientific使浮点数按科学表示法使浮点数按科学表示法 ( (指数形式指数形式) )进行显示。进行显示。运行程序第7章 C+C+的的 I/0 I/0 流类库流类库 输出结果为输出结果为: : 十十567 567 十十5 56789e02 6789e02 第7章 C+C+的的 I/0 I/0 流类库流类库 (2)(2)清除状态标志清除状态标志 long long ios:unsetf(longios:unsetf(long flags) flags) 调用格式

19、调用格式: : 流对象流对象 unsetf(iosunsetf(ios: :状态标志状态标志); ); (3) (3)取状态标志取状态标志 long long ios:flagsios:flags();(); / /用于返回当前的状态标志字用于返回当前的状态标志字 long long ios:flags(longios:flags(long flag); flag); / / 将状态标志字设置为将状态标志字设置为flagflag,并返回设置前的状态标志字,并返回设置前的状态标志字 差别在于差别在于: : setfsetf() ()函数是在原有的基础上追加设定的,函数是在原有的基础上追加设定的,

20、 flags()flags()函数是用新设定覆盖以前的状态标志字。函数是用新设定覆盖以前的状态标志字。第7章 C+C+的的 I/0 I/0 流类库流类库 例例 7 2 7 2 #include #include void void showflags(longshowflags(long f) f) long i; long i; for(ifor(i= Ox8000;i;i=i1) = Ox8000;i;i=i1) / /用右移方法使用右移方法使 i i中的值为中的值为”l”l”的位不断右的位不断右移移 if(i&f)coutif(i&f)cout1; /1; /判断判断 f

21、 f中的某一位是否为中的某一位是否为11 else else coutcout0;0; coutcoutendlendl; ; main() main() long f; long f; f= f= cout.flagscout.flags(); /(); /取当前状态标志字取当前状态标志字 showflags(fshowflags(f); /); /显示状态标志字显示状态标志字 运行程序第7章 C+C+的的 I/0 I/0 流类库流类库 coutcout setf(ios:showposlios:scientificsetf(ios:showposlios:scientific); ); /

22、 /追加状态标志位追加状态标志位 f= f= coutcout flags(); flags(); showflags(fshowflags(f); ); coutcout unsetf(ios:scientificunsetf(ios:scientific); /); /从状态标志字中去掉从状态标志字中去掉 scientificscientific f= f= coutcout flags() flags(), showflags(fshowflags(f); ); f= f= coutcout flags(ios:octflags(ios:oct); /); /重新设置状态标志字重新设置状

23、态标志字 showflags(fshowflags(f); /); /显示设置前的状态标志字显示设置前的状态标志字 f= f= coutcout. flags(); /. flags(); /取设置后的状态标志字取设置后的状态标志字 showflags(fshowflags(f) ; /) ; /显示设置后的状态标志字显示设置后的状态标志字 return 0;return 0; 第7章 C+C+的的 I/0 I/0 流类库流类库 程序运行结果为程序运行结果为 : : 0010000000000001 0010000000000001 0010110000000001 0010110000000

24、001 0010010000000001 0010010000000001 0000000000100000 0000000000100000 0000000000100000 0000000000100000 第7章 C+C+的的 I/0 I/0 流类库流类库 (4)(4)设置城宽设置城宽 intios:widthintios:width();(); / /返回当前的域宽值返回当前的域宽值 intios:width(intwintios:width(intw); /); / 设置城宽,并返回原来的域宽设置城宽,并返回原来的域宽(5)(5)设置显示的精度设置显示的精度 intios:preci

25、sion(intintios:precision(int p); p);重新设置浮点数小数的位数,返回设置前的小数点后的位数。重新设置浮点数小数的位数,返回设置前的小数点后的位数。(6)(6)填充字符填充字符 char char ios:fillios:fill();(); / /返回当前的填充字符返回当前的填充字符 char char ios:fill(charios:fill(char chch); ); / /重新设置填充字符,并返回设置前的填充字符重新设置填充字符,并返回设置前的填充字符第7章 C+C+的的 I/0 I/0 流类库流类库 例例7 3 #include7 3 #inclu

26、de main()main() coutcoutx_widthx_width=coutcout width() width()endlendl; ; coutcout”x_fil1=”x_fil1=”cout.fillcout.fill()()endlendl; ; coutcoutx_precisionx_precision=cout.precisioncout.precision()()endlendl; ; coutcout123” ”123 45678123” ”123 45678endlendl; ; coucou-n;-n; coutcout”* * * * * * x_width

27、x_width=1O=1O,x_fillx_fill= =, x_precisionx_precision=4 =4 * * * * * *n;n; coutwidth(l0); coutwidth(l0); cout.precision(4); cout.precision(4); 第7章 C+C+的的 I/0 I/0 流类库流类库 coutcout123” ”12345678” ”234567123” ”12345678” ”234567endlendl; ; coutcoutx_widthx_width=”=”cout.widthcout.width()()endlendl; ; cou

28、t”x_fil1=”cout.fill()endl; coutx_precision=cout.precision()endl; cout”-n; cout”* * * x_width=lO,x_fill=&, x_precision=4 * * *n; coutfill(&); coutwidth(l0); cout123” ”12345678endl; 运行程序第7章 C+C+的的 I/0 I/0 流类库流类库 coutcout set(ios:leftset(ios:left); ); coutwidth(l0); coutwidth(l0); coutcout123”

29、”123 45678123” ”123 45678endlendl; ; coutcoutx_widthx_width=”=”cout.widthcout.width()()endlendl; ; coutcout”x_fil1=”x_fil1=”cout.fillcout.fill()()endlendl; ; coutcoutx_precisionx_precision=cout.precisioncout.precision()()endlendl; ; return O; return O; 第7章 C+C+的的 I/0 I/0 流类库流类库 程序运行结果如下程序运行结果如下 x_wi

30、dthx_width=o=o x_fillx_fill= = x_precisionx_precision= O= O 123 12345678 123 12345678 - - * * * * * * x_widthx_width= =lOlO,x_fillx_fill= = ,x_precisionx_precision=4 =4 * * * * * * 123 1234568 234567 123 1234568 234567 x_widthx_width=o=o x_fillx_fill= = x_precisionx_precision=4=4 - - * * * * * * x_w

31、idthx_width= =lOlO,x_fillx_fill= = ,x_precisionx_precision=4 =4 * * * * * * &123 1234568 &123 1234568 123& 123.4568 123& 123.4568 x_widthx_width=o=o x_fillx_fill=&=& x_precisionx_precision=4=4第7章 C+C+的的 I/0 I/0 流类库流类库 缺省情况下缺省情况下 ,x_widthx_width取值为取值为00,数据按自身的宽度打,数据按自身的宽度打印印 ;

32、 ;x_fillx_fill取值为空格取值为空格 ; ;x_precisionx_precision 取值为取值为00,数据按实际的小,数据按实际的小数位数打印。数位数打印。 用用width()width()函数设置了域宽后,只对紧跟着它的第一个输函数设置了域宽后,只对紧跟着它的第一个输出有影响。而调用出有影响。而调用precision()precision()函数和函数和fill()fill()函数,设置函数,设置x_fillx_fill 和和x_precisionx_precision后,在程序中一直有效,除非它们被重新设置。后,在程序中一直有效,除非它们被重新设置。 当设置了当设置了x_

33、precisionx_precision后,当实际输出的小数位数大于后,当实际输出的小数位数大于x_precisionx_precision,则以,则以x_precisionx_precision的位数按四舍五入输出的位数按四舍五入输出; ;当实际输当实际输出的小数位数小于出的小数位数小于x_precisionx_precision,则按实际的小数位数输出。,则按实际的小数位数输出。 当显示数据所需的宽度比使用当显示数据所需的宽度比使用ios:widthios:width() ()设置的宽度小时,设置的宽度小时,填充字符。填充位置由填充字符。填充位置由ios:leftios:left和和ios

34、ios: right: right规定。规定。第7章 C+C+的的 I/0 I/0 流类库流类库 例例7 74 4如何利用控制输入输出格式的成员函数建立对齐的数字表。如何利用控制输入输出格式的成员函数建立对齐的数字表。 显示数显示数120120的二次方表与二次方根表的二次方表与二次方根表 #include#include #include #include main()main() double x; double x; coutcout precision(4); precision(4); coutcout x x sqrt(xsqrt(x) x2nn;) x2nn; for(xfor(x

35、=l.0; x=20.0; x+)=l.0; x=20.0; x+) coutwidth(8); coutwidth(8); coutcoutx ;x ; coutwidth(8); coutwidth(8); coutcoutsqrt(xsqrt(x) ;) ; coutwidth(8); coutwidth(8); coutcoutxx* *xn;xn; return 0; return 0; 运行程序第7章 C+C+的的 I/0 I/0 流类库流类库 这个程序建立了如下的表这个程序建立了如下的表: : x x sqrt(xsqrt(x) x2) x2 1 1 1 1 1 1 2 1.14

36、2 4 2 1.142 4 3 1.7321 9 3 1.7321 9 4 2 16 4 2 16 5 2.2361 25 5 2.2361 25 6 2.4495 36 6 2.4495 36 7 2.6458 49 7 2.6458 49 8 2.8284 64 8 2.8284 64 9 3 81 9 3 81 10 3.1623 100 10 3.1623 100 11 3.3166 121 11 3.3166 121 12 3.4641 144 12 3.4641 144 13 3.6056 169 13 3.6056 169 14 3.7417 196 14 3.7417 196

37、15 3.873 225 15 3.873 225 16 4 256 16 4 256 17 4.1231 289 17 4.1231 289 18 4.2426 324 18 4.2426 324 19 4.3598 361 19 4.3598 361 20 4.4721 400 20 4.4721 400第7章 C+C+的的 I/0 I/0 流类库流类库 7.3.2 7.3.2 使用操纵符进行输入输出格式控制使用操纵符进行输入输出格式控制 1.C1.C十十预定义的操纵符十十预定义的操纵符 ( (l) l)decdec 以十进制形式输入或输出整型数,可用于输入或输出。以十进制形式输入或输出整

38、型数,可用于输入或输出。 (2)(2)hexhex 以十六进制形式输入或输出整型数,可用于输入或输出。以十六进制形式输入或输出整型数,可用于输入或输出。 (3)(3)octoct以八进制形式输入或输出整型数,可用于输入或输出。以八进制形式输入或输出整型数,可用于输入或输出。 (4)(4)wsws用于在输入时跳过开头的空白符,仅用于输入。用于在输入时跳过开头的空白符,仅用于输入。 (5)(5)endlendl插入一个换行符并刷新输出流,仅用于输出。插入一个换行符并刷新输出流,仅用于输出。 (6)(6)endsends插入一个空字符,用来结束一个字符串,仅用于输出。插入一个空字符,用来结束一个字符

39、串,仅用于输出。 (7)(7)flush flush 刷新一个输出流,仅用于输出。刷新一个输出流,仅用于输出。 第7章 C+C+的的 I/0 I/0 流类库流类库 (8)setbase(int n)(8)setbase(int n)把转换基数设置为把转换基数设置为n(nn(n的取值为的取值为0 0,8 8,1010或或16)16),n n的缺省值为的缺省值为0 0,即以十进制形式输出。,即以十进制形式输出。 (9)resetiosflag(long f)(9)resetiosflag(long f)关闭由参数关闭由参数f f指定的格式标志,可用于指定的格式标志,可用于输入或输出。输入或输出。

40、(10)setiosflags(long f)(10)setiosflags(long f)设置由参数设置由参数f f指定的格式标志,可用于指定的格式标志,可用于输人或输出输人或输出 。 (11)setfill(int c) c(11)setfill(int c) c为填充字符,缺省时为空格,可用于输入或为填充字符,缺省时为空格,可用于输入或输出。输出。 (12)setprecision(int n) (12)setprecision(int n) 设置数据小数部分的位数,缺省时小设置数据小数部分的位数,缺省时小数的位数数的位数6 6,可用于输人或输出,可用于输人或输出 (13)setw(in

41、t n) (13)setw(int n) 设置域宽为设置域宽为n n,可用于输入或输出,可用于输入或输出 。 第7章 C+C+的的 I/0 I/0 流类库流类库 操纵符操纵符 setiosflagssetiosflags() ()和和 resetiosflagsresetiosflags() ()中所用的格式标志中所用的格式标志: : ios:leftios:left 输出数据按域宽左对齐输出输出数据按域宽左对齐输出 ios:rightios:right 输出数据按域宽右对齐输出输出数据按域宽右对齐输出 ios:scientificios:scientific 使用科学计数法表示浮点数使用科学

42、计数法表示浮点数 ios:fixedios:fixed 使用定点形式表示浮点数使用定点形式表示浮点数 ios:decios:dec 转换基数为十进制形式转换基数为十进制形式 ios:hexios:hex 转换基数为十六进制形式转换基数为十六进制形式 ios:octios:oct 转换基数为八进制形式转换基数为八进制形式 ios:uppercaseios:uppercase 十六进制形式和科学计数法输出时十六进制形式和科学计数法输出时, , 表示数值的字符一律为大写表示数值的字符一律为大写 ios:showbaseios:showbase 输出带有一个表示制式的字符输出带有一个表示制式的字符 i

43、os:showposios:showpos 在正数前添加一个在正数前添加一个”十十”号号 ios:showpointios:showpoint 浮点输出时对必须带有一个小数点浮点输出时对必须带有一个小数点第7章 C+C+的的 I/0 I/0 流类库流类库 操纵符的使用操纵符的使用 不带参数的操纵符在不带参数的操纵符在iostreamiostream h h 文件中定义,带文件中定义,带参数的在参数的在iomanipiomanip h h 文件中定义。在进行输入输出文件中定义。在进行输入输出时时 ,操纵符被嵌人到输人或输出链中,用来控制输入,操纵符被嵌人到输人或输出链中,用来控制输入输出的格式,

44、而不是执行输入或输出操作输出的格式,而不是执行输入或输出操作 。第7章 C+C+的的 I/0 I/0 流类库流类库 例例 7575 #include #include #include #include main() main() coutcoutsetwsetw (l0)123567 (l0)123567endlendl; ; coutcout123123setiosflags(iossetiosflags(ios: scientific): scientific) setwsetw (20)123.456789 (20)123.456789endlendl; ; coutcout123se

45、tw(l0)hex123123setw(l0)hex123endlendl; ; coutcout123setw(l0)123setw(l0)octoct123123endlendl; ; coutcout123setw(l0)123setw(l0)setbase(Osetbase(O)123)123endlendl; ; 运行程序第7章 C+C+的的 I/0 I/0 流类库流类库 coutcoutresetlosflags(ios:scientificresetlosflags(ios:scientific) ) setprecision(4)123.456789 setprecision(

46、4)123.456789endlendl; ; coutcoutsetiosflags(ios:leftsetiosflags(ios:left)setfillsetfill(#) (#) setw(8)123 setw(8)123endlendl; ; coutcoutresetiosflags(ios:leftresetiosflags(ios:left)setfillsetfill($)($) setw(8)456 setw(8)456endlendl; ; return 0; return 0; 第7章 C+C+的的 I/0 I/0 流类库流类库 程序运行结果为程序运行结果为: : 1

47、23567 123567 123 1.234567e+02 123 1.234567e+02 123 7b 123 7b 7b 173 7b 173 173 123 173 123 123.4568 123.4568 123# 123# $456 $456 第7章 C+C+的的 I/0 I/0 流类库流类库 例例7.6 7.6 显示数显示数120120的二次方表与二次方根表的二次方表与二次方根表。#include#include h#include#include h#include#includemain()main() double x; double x; coutcoutsetprec

48、ision(4);setprecision(4); coutcout x x sqrt(xsqrt(x) x2nn;) x2nn; for(xfor(x=1.0;x=20.0;x=1.0;x=20.0;x十十十十) ) coutcoutsetw(8)x ;setw(8)x ; coutcoutsetw(8)setw(8)sqrt(xsqrt(x) ;) ; coutcoutsetw(8)xsetw(8)x* *xn;xn; return 0; return 0; 运行程序第7章 C+C+的的 I/0 I/0 流类库流类库 3 3用户自定义的操纵符用户自定义的操纵符 (1)(1) 输出流定义操纵

49、符函数输出流定义操纵符函数: : ostreamostream & &manip_name(ostreammanip_name(ostream &stream) &stream) / /自定义代码自定义代码 return stream;return stream; (2) (2)输入流定义操纵符函数输入流定义操纵符函数: : istreamistream & &manip_name(istreammanip_name(istream &stream) &stream) / /自定义代码自定义代码 return stream;ret

50、urn stream; 式中,式中,manip_namemanip_name是操纵符函数的名字,其它单词是操纵符函数的名字,其它单词可照原样写上。在此,操纵符返回可照原样写上。在此,操纵符返回stream(stream(也可用其它标也可用其它标识符识符) )是一个关键,否则操纵符就不能用在流的输入输出是一个关键,否则操纵符就不能用在流的输入输出操作序列中。操作序列中。第7章 C+C+的的 I/0 I/0 流类库流类库 例例 7777#include#include h#include#include ostreamostream & &outputl(ostreamoutput

51、l(ostream &stream ) &stream ) stream stream setf(ios:leftsetf(ios:left); ); stream streamsetwsetw (l0)hex (l0)hexsetfillsetfill(&);(&); return stream ; return stream ; intint main() main() coutcout123123endlendl; ; coutcoutoutput 1123output 1123endlendl; ; return O; return O; 运行程序第7章

52、 C+C+的的 I/0 I/0 流类库流类库 程序运行结果如程序运行结果如 下下 : : 123 123 7b& 7b&第7章 C+C+的的 I/0 I/0 流类库流类库 该程序建立了一个操纵符函数该程序建立了一个操纵符函数outputloutputl,其功能为其功能为: :设置左对齐格式标志,把域宽置设置左对齐格式标志,把域宽置为为 1010,整数按,整数按16 16 进制输出,填空字符为进制输出,填空字符为&。在。在 main()main()函数中引用谅函数时,只写函数中引用谅函数时,只写 outputloutputl 即可。其调用方法与预定义操纵即可。其调用方法与

53、预定义操纵符,如符,如 decdec、endlendl等完全一样等完全一样 。第7章 C+C+的的 I/0 I/0 流类库流类库 例例 7 87 8#include#include #include#include istreamistream &inputlinputl ( (istreamistream &in) &in) cincinhex;hex; coutcout”Enter number using hex format:;inputlinputli;i; coutcoutendlendl; ; return O; return O; 运行程序第7章 C+C

54、+的的 I/0 I/0 流类库流类库 7 74 4 用户自定义类型的输入输出用户自定义类型的输入输出 通过重载运算符通过重载运算符来实现。来实现。 7 74 41 1 重载输出运算符重载输出运算符 ostream &operator(ostream &stream,class_name obj) /操作代码操作代码 return stream; 函数中第一个参数是对函数中第一个参数是对ostreamostream对象的引用。这意味着对象的引用。这意味着streamstream必须是输出流必须是输出流( (注意注意: :ostreamostream是在是在iosios内部定义的内

55、部定义的) ),它可,它可以是其它任何合法的标识符,但必须与以是其它任何合法的标识符,但必须与returnreturn后面的标识符相后面的标识符相同。第二个参数接收将被输出的对象,其中同。第二个参数接收将被输出的对象,其中class_nameclass_name是类名,是类名,objobj为该类的对象名。为该类的对象名。第7章 C+C+的的 I/0 I/0 流类库流类库 7 79 9 输出运算符输出运算符重载的例子重载的例子#include#include class class coordcoord public: public: intint x x,y;y; coordcoord() x

56、=() x=O;yO;y=O;=O; coord(intcoord(int i i,intint j) x=i; y=j; ; j) x=i; y=j; ;ostreamostream &operator&operator ( (ostreamostream & &treamtream,coordcoord ob) ob) streamob x” streamob x”,”ob yob yendlendl; ; return stream; return stream; main()main() coordcoord a(5 a(5,6),b(l06),b(l0

57、,34);34); coutcoutabab; ; return O; return O; 第7章 C+C+的的 I/0 I/0 流类库流类库 程序运行结果如下程序运行结果如下: 5,6 10,34运行程序第7章 C+C+的的 I/0 I/0 流类库流类库 一般情况下,一般情况下,重载输出运算符函数及重载输重载输出运算符函数及重载输入运算符函数都不能是类的成员入运算符函数都不能是类的成员, ,应该定义为类的应该定义为类的友元函数。友元函数。 因为如果一个运算符函数是类的成员,则其因为如果一个运算符函数是类的成员,则其左运算数就应当是调用运算符函数的类的对象,左运算数就应当是调用运算符函数的类的

58、对象,而且这一点是无法改变的。但重载输出运算符时,而且这一点是无法改变的。但重载输出运算符时,其左边的参数是流,而右边参数是类的对象。因其左边的参数是流,而右边参数是类的对象。因此,重载输出运算符必须是非成员函数。此,重载输出运算符必须是非成员函数。 第7章 C+C+的的 I/0 I/0 流类库流类库 例例710 #include710 #include hclass class coordcoord intint x x,y;y; public: public: coordcoord() x=() x=O;yO;y=O;=O; coord(intcoord(int i i,intint j)

59、 x=i; y=j; j) x=i; y=j; friend friend ostreamostream &operator( &operator(ostreamostream & &treamtream, coordcoord ob); ; ob); ;ostreamostream &operator( &operator(ostreamostream & &treamtream,coordcoord ob) ob) streamob x” streamob x”,”ob yob yendlendl; return ; retu

60、rn stream;stream;main()main() coordcoord a(5 a(5,6),b(l06),b(l0,34);34); coutcoutab;a istream &operator(istream &stream, class_name &ob) /操作代码操作代码 return stream; 与重载输出运算符函数一样,重载输入运算符与重载输出运算符函数一样,重载输入运算符函数也不能是所操作的类的成员函数,但可以是该函数也不能是所操作的类的成员函数,但可以是该类的友元函数或独立函数。类的友元函数或独立函数。第7章 C+C+的的 I/0 I/0 流类库流类库 例例7 11 #include7 11 #include class class three_dthree_d intint x,y,zx,y,z; ; public: public: three_d(intthree_d(int a,inta,int b,intb,int c) x= c) x=a;ya;y= =b;zb;z=c;=c; friend friend ostreamostream &operator( &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论