




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第7章 C+C+的的 I/0 I/0 流類庫流類庫 第7章 C+的I/O流類庫 7 71 c1 c十十為何建立自己的輸入輸出系統(tǒng)十十為何建立自己的輸入輸出系統(tǒng)7 72 c2 c十十的流及流類庫十十的流及流類庫7 73 3 輸入輸出的格式控制輸入輸出的格式控制7 74 4 用戶自定義類型的輸入輸出用戶自定義類型的輸入輸出7.5 7.5 文件的輸入輸出文件的輸入輸出7 76 6 應(yīng)用舉例應(yīng)用舉例第7章 C+C+的的 I/0 I/0 流類庫流類庫 7 71 C+1 C+為何建立自己的輸入輸出系統(tǒng)為何建立自己的輸入輸出系統(tǒng) 在在c c十十中需要定義眾多的用戶自定義類型,但十十中需要定義眾多的用戶自定義
2、類型,但c c語言語言的輸入輸出系統(tǒng)不支持用戶自定義的對象。的輸入輸出系統(tǒng)不支持用戶自定義的對象。 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十十的輸入輸出系統(tǒng),就可以通過重載十十的輸入輸出系統(tǒng),就可以通過重載運(yùn)算符來解決以上問題。運(yùn)算符來解決以上問題。C C十十的類機(jī)制允許它建立一十十的類機(jī)制允許它建立一個(gè)可
3、擴(kuò)展的輸入輸出系統(tǒng),它可以通過修改和擴(kuò)展來加入個(gè)可擴(kuò)展的輸入輸出系統(tǒng),它可以通過修改和擴(kuò)展來加入用戶自定義類型及相應(yīng)操作。用戶自定義類型及相應(yīng)操作。第7章 C+C+的的 I/0 I/0 流類庫流類庫 7 72 c2 c十十的流及流類庫十十的流及流類庫7.2.l C7.2.l C十十的流十十的流 輸入輸出是一種數(shù)據(jù)傳遞操作,它可以看作字符序輸入輸出是一種數(shù)據(jù)傳遞操作,它可以看作字符序列在主機(jī)與外部介質(zhì)之間的流動(dòng)。流列在主機(jī)與外部介質(zhì)之間的流動(dòng)。流( (stream)stream)為從源為從源到目的的數(shù)據(jù)流的引用。每個(gè)流都是一種與設(shè)備相聯(lián)系到目的的數(shù)據(jù)流的引用。每個(gè)流都是一種與設(shè)備相聯(lián)系的對象。流
4、具有方向性的對象。流具有方向性. C. C十十的流十十的流 與輸入設(shè)備與輸入設(shè)備( (如鍵盤如鍵盤) )相聯(lián)系的流稱為輸入流相聯(lián)系的流稱為輸入流; ; 與輸出設(shè)備與輸出設(shè)備( (屏幕屏幕) )相聯(lián)系的流稱為輸出流相聯(lián)系的流稱為輸出流; ; 與輸入輸出設(shè)備與輸入輸出設(shè)備( (如磁盤如磁盤) )相聯(lián)系的流稱為輸入輸出流。相聯(lián)系的流稱為輸入輸出流。第7章 C+C+的的 I/0 I/0 流類庫流類庫 . . 四個(gè)預(yù)定義流及所關(guān)聯(lián)的具體設(shè)備:四個(gè)預(yù)定義流及所關(guān)聯(lián)的具體設(shè)備: (1)(1)標(biāo)準(zhǔn)輸入流標(biāo)準(zhǔn)輸入流cincin : : 與標(biāo)準(zhǔn)輸入設(shè)備相關(guān)聯(lián)與標(biāo)準(zhǔn)輸入設(shè)備相關(guān)聯(lián); ; (2)(2)標(biāo)準(zhǔn)輸出流標(biāo)準(zhǔn)輸
5、出流coutcout : :與標(biāo)準(zhǔn)輸出設(shè)備相關(guān)聯(lián)與標(biāo)準(zhǔn)輸出設(shè)備相關(guān)聯(lián); ; (3)(3)非緩沖型的標(biāo)準(zhǔn)出錯(cuò)流非緩沖型的標(biāo)準(zhǔn)出錯(cuò)流cerrcerr : :與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián); ; (4)(4)緩沖型的標(biāo)準(zhǔn)出錯(cuò)流緩沖型的標(biāo)準(zhǔn)出錯(cuò)流clogclog : :與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián). . 指定的標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備總是顯示終端。指定的標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備總是顯示終端。 cerrcerr和和clogclog之間的區(qū)別是之間的區(qū)別是: :cerrcerr沒有被緩沖,因而發(fā)送給它的沒有被緩沖,因而發(fā)送給它的任何內(nèi)容都立即輸出任何內(nèi)容都立即輸出; ;相反,相反,c
6、logclog被緩沖,當(dāng)緩沖區(qū)滿時(shí)才進(jìn)被緩沖,當(dāng)緩沖區(qū)滿時(shí)才進(jìn)行輸出,也可以通過刷新流的方式強(qiáng)迫刷新緩沖區(qū)。行輸出,也可以通過刷新流的方式強(qiáng)迫刷新緩沖區(qū)。 在程序中,也可以把錯(cuò)誤信息送到在程序中,也可以把錯(cuò)誤信息送到coutcout。但當(dāng)用戶把標(biāo)準(zhǔn)輸。但當(dāng)用戶把標(biāo)準(zhǔn)輸出設(shè)備定向?yàn)槠渌O(shè)備時(shí),出設(shè)備定向?yàn)槠渌O(shè)備時(shí),cerrcerr仍然把信息送給顯示終端,以仍然把信息送給顯示終端,以便用戶能立即看到該信息。便用戶能立即看到該信息。第7章 C+C+的的 I/0 I/0 流類庫流類庫 7.2.2 7.2.2流類庫流類庫兩個(gè)基類兩個(gè)基類: : streambufstreambuf類和類和iosios類
7、類。 1.streambuf1.streambuf類類 (1)(1)用作流類庫的其它部分使用的基類用作流類庫的其它部分使用的基類 提供對緩沖區(qū)的低級(jí)操作,如設(shè)置緩沖區(qū)、對緩沖區(qū)指針提供對緩沖區(qū)的低級(jí)操作,如設(shè)置緩沖區(qū)、對緩沖區(qū)指針進(jìn)行操作、從緩沖區(qū)取字符、向緩沖區(qū)存儲(chǔ)字符等。進(jìn)行操作、從緩沖區(qū)取字符、向緩沖區(qū)存儲(chǔ)字符等。 (2)(2) 派生出三個(gè)類:派生出三個(gè)類: filebuffilebuf類類使用文件來保存緩沖區(qū)中的字符序列。將使用文件來保存緩沖區(qū)中的字符序列。將filebuffilebuf同同某個(gè)文件的描述字相聯(lián)系就稱打開這個(gè)文件。、某個(gè)文件的描述字相聯(lián)系就稱打開這個(gè)文件。、 strst
8、reambufstrstreambuf類提供了在內(nèi)存中進(jìn)行提取和插入操作的緩沖類提供了在內(nèi)存中進(jìn)行提取和插入操作的緩沖區(qū)管理。區(qū)管理。 conbufconbuf類用于處理輸出。它提供了控制光標(biāo)、設(shè)置顏色、定類用于處理輸出。它提供了控制光標(biāo)、設(shè)置顏色、定義活動(dòng)窗口、清屏、清一行等功能,為輸出操作提供緩沖區(qū)管義活動(dòng)窗口、清屏、清一行等功能,為輸出操作提供緩沖區(qū)管理。理。第7章 C+C+的的 I/0 I/0 流類庫流類庫 2. 2.iosios類類 iosios類類( (及其派生類及其派生類) )使用使用streambufstreambuf及其派生類完成檢查錯(cuò)及其派生類完成檢查錯(cuò)誤的格式化輸入輸出,
9、并支持對誤的格式化輸入輸出,并支持對streambufstreambuf的緩沖區(qū)進(jìn)行的緩沖區(qū)進(jìn)行輸入輸出時(shí)的格式化或非格式化轉(zhuǎn)換。輸入輸出時(shí)的格式化或非格式化轉(zhuǎn)換。 (1) (1) 四個(gè)直接派生類:四個(gè)直接派生類: 輸入流類輸入流類 istreamistream 輸出流類輸出流類 ostreamostream 文件流類文件流類 fstreambasefstreambase 串流類串流類 strstreambasestrstreambase 第7章 C+C+的的 I/0 I/0 流類庫流類庫 (2)(2)各個(gè)類的繼承關(guān)系各個(gè)類的繼承關(guān)系: : 輸入輸出流類輸入輸出流類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 可可以派生出多個(gè)實(shí)用的流類以派生出多個(gè)實(shí)用的流類 . . fstreamfstream ( (輸入輸出輸入輸出 文件流類文件流類) )、strstreamstrstream ( (輸入輸出輸入輸出 串流類串流類) )、con_streamcon_stream ( (屏幕輸出屏幕輸出 流類流類) )、ifstreamifstream ( (輸入文件流類輸入文件流類) )、ofstreamofstream ( (輸輸 出出 文件流類文件流類) )、 istrstream
12、istrstream( (輸入串流類輸入串流類) )和和 ostrstreamostrstream ( (輸出串流類輸出串流類) )等。等。第7章 C+C+的的 I/0 I/0 流類庫流類庫 在在 istreamistream 類、類、ostreamostream 類和類和 iostreamiostream 類的基礎(chǔ)上類的基礎(chǔ)上 ,分別,分別重載賦值運(yùn)算符重載賦值運(yùn)算符= = ,就派生出,就派生出istream_withassignistream_withassign、ostream_withassignostream_withassign和和iostream_withassigniostre
13、am_withassign類類 在開始執(zhí)行在開始執(zhí)行C C十十程序時(shí)十十程序時(shí) ,系統(tǒng)自動(dòng)打開的預(yù)定義流,系統(tǒng)自動(dòng)打開的預(yù)定義流 :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; ; 使用流類庫,程序既可以識(shí)別系統(tǒng)預(yù)定義的使用流類庫,程序既可以識(shí)別系統(tǒng)預(yù)
15、定義的I/OI/O類型,又類型,又可以重載運(yùn)算符可以重載運(yùn)算符,使程序能夠識(shí)別用戶定義的類,使程序能夠識(shí)別用戶定義的類型,大大提高程序的可靠性和靈活性。型,大大提高程序的可靠性和靈活性。第7章 C+C+的的 I/0 I/0 流類庫流類庫 7 73 3 輸入輸出的格式控制輸入輸出的格式控制7.3.1 7.3.1 用用iosios的成員函數(shù)進(jìn)行格式控制的成員函數(shù)進(jìn)行格式控制1 1狀態(tài)標(biāo)志字狀態(tài)標(biāo)志字 由一個(gè)由一個(gè)longintlongint類型的狀態(tài)標(biāo)志字確定。在類型的狀態(tài)標(biāo)志字確定。在iosios類的類的publicpublic部分定義了一個(gè)枚舉,它的每個(gè)成員可以分別定義狀態(tài)標(biāo)志部分定義了一個(gè)枚
16、舉,它的每個(gè)成員可以分別定義狀態(tài)標(biāo)志字的一個(gè)位,每一位都稱為一個(gè)狀態(tài)標(biāo)志位。字的一個(gè)位,每一位都稱為一個(gè)狀態(tài)標(biāo)志位。2 2 iosios類中用于控制輸入輸出格式的成員函數(shù)類中用于控制輸入輸出格式的成員函數(shù) (1)(1)設(shè)置狀態(tài)標(biāo)志設(shè)置狀態(tài)標(biāo)志 long long ios:setf(longios:setf(long flags) flags)調(diào)用格式為調(diào)用格式為: : 流對象流對象 setfsetf ( ( iosios: :狀態(tài)標(biāo)志狀態(tài)標(biāo)志); ); 第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); ); / /設(shè)置輸出左對齊設(shè)置輸出左對齊例例7 71 1 #include #include main() main() coutcout setf(ios:showpossetf(ios:showpos| | ios:scientificios:scientific); ); coutcout567” ”56789567” ”56789nd
18、lndl; ; 設(shè)置設(shè)置showposshowpos使得每個(gè)正數(shù)前添加使得每個(gè)正數(shù)前添加“十十”號(hào),號(hào),設(shè)置設(shè)置scientificscientific使浮點(diǎn)數(shù)按科學(xué)表示法使浮點(diǎn)數(shù)按科學(xué)表示法 ( (指數(shù)形式指數(shù)形式) )進(jìn)行顯示。進(jìn)行顯示。運(yùn)行程序第7章 C+C+的的 I/0 I/0 流類庫流類庫 輸出結(jié)果為輸出結(jié)果為: : 十十567 567 十十5 56789e02 6789e02 第7章 C+C+的的 I/0 I/0 流類庫流類庫 (2)(2)清除狀態(tài)標(biāo)志清除狀態(tài)標(biāo)志 long long ios:unsetf(longios:unsetf(long flags) flags) 調(diào)用格式
19、調(diào)用格式: : 流對象流對象 unsetf(iosunsetf(ios: :狀態(tài)標(biāo)志狀態(tài)標(biāo)志); ); (3) (3)取狀態(tài)標(biāo)志取狀態(tài)標(biāo)志 long long ios:flagsios:flags();(); / /用于返回當(dāng)前的狀態(tài)標(biāo)志字用于返回當(dāng)前的狀態(tài)標(biāo)志字 long long ios:flags(longios:flags(long flag); flag); / / 將狀態(tài)標(biāo)志字設(shè)置為將狀態(tài)標(biāo)志字設(shè)置為flagflag,并返回設(shè)置前的狀態(tài)標(biāo)志字,并返回設(shè)置前的狀態(tài)標(biāo)志字 差別在于差別在于: : setfsetf() ()函數(shù)是在原有的基礎(chǔ)上追加設(shè)定的,函數(shù)是在原有的基礎(chǔ)上追加設(shè)定的,
20、 flags()flags()函數(shù)是用新設(shè)定覆蓋以前的狀態(tài)標(biāo)志字。函數(shù)是用新設(shè)定覆蓋以前的狀態(tài)標(biāo)志字。第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(); /(); /取當(dāng)前狀態(tài)標(biāo)志字取當(dāng)前狀態(tài)標(biāo)志字 showflags(fshowflags(f); /); /顯示狀態(tài)標(biāo)志字顯示狀態(tài)標(biāo)志字 運(yùn)行程序第7章 C+C+的的 I/0 I/0 流類庫流類庫 coutcout setf(ios:showposlios:scientificsetf(ios:showposlios:scientific); ); /
22、 /追加狀態(tài)標(biāo)志位追加狀態(tài)標(biāo)志位 f= f= coutcout flags(); flags(); showflags(fshowflags(f); ); coutcout unsetf(ios:scientificunsetf(ios:scientific); /); /從狀態(tài)標(biāo)志字中去掉從狀態(tài)標(biāo)志字中去掉 scientificscientific f= f= coutcout flags() flags(), showflags(fshowflags(f); ); f= f= coutcout flags(ios:octflags(ios:oct); /); /重新設(shè)置狀態(tài)標(biāo)志字重新設(shè)置狀
23、態(tài)標(biāo)志字 showflags(fshowflags(f); /); /顯示設(shè)置前的狀態(tài)標(biāo)志字顯示設(shè)置前的狀態(tài)標(biāo)志字 f= f= coutcout. flags(); /. flags(); /取設(shè)置后的狀態(tài)標(biāo)志字取設(shè)置后的狀態(tài)標(biāo)志字 showflags(fshowflags(f) ; /) ; /顯示設(shè)置后的狀態(tài)標(biāo)志字顯示設(shè)置后的狀態(tài)標(biāo)志字 return 0;return 0; 第7章 C+C+的的 I/0 I/0 流類庫流類庫 程序運(yùn)行結(jié)果為程序運(yùn)行結(jié)果為 : : 0010000000000001 0010000000000001 0010110000000001 0010110000000
24、001 0010010000000001 0010010000000001 0000000000100000 0000000000100000 0000000000100000 0000000000100000 第7章 C+C+的的 I/0 I/0 流類庫流類庫 (4)(4)設(shè)置城寬設(shè)置城寬 intios:widthintios:width();(); / /返回當(dāng)前的域?qū)捴捣祷禺?dāng)前的域?qū)捴?intios:width(intwintios:width(intw); /); / 設(shè)置城寬,并返回原來的域?qū)捲O(shè)置城寬,并返回原來的域?qū)?5)(5)設(shè)置顯示的精度設(shè)置顯示的精度 intios:preci
25、sion(intintios:precision(int p); p);重新設(shè)置浮點(diǎn)數(shù)小數(shù)的位數(shù),返回設(shè)置前的小數(shù)點(diǎn)后的位數(shù)。重新設(shè)置浮點(diǎn)數(shù)小數(shù)的位數(shù),返回設(shè)置前的小數(shù)點(diǎn)后的位數(shù)。(6)(6)填充字符填充字符 char char ios:fillios:fill();(); / /返回當(dāng)前的填充字符返回當(dāng)前的填充字符 char char ios:fill(charios:fill(char chch); ); / /重新設(shè)置填充字符,并返回設(shè)置前的填充字符重新設(shè)置填充字符,并返回設(shè)置前的填充字符第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; 運(yùn)行程序第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 流類庫流類庫 程序運(yùn)行結(jié)果如下程序運(yùn)行結(jié)果如下 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,數(shù)據(jù)按自身的寬度打,數(shù)據(jù)按自身的寬度打印印 ;
32、 ;x_fillx_fill取值為空格取值為空格 ; ;x_precisionx_precision 取值為取值為00,數(shù)據(jù)按實(shí)際的小,數(shù)據(jù)按實(shí)際的小數(shù)位數(shù)打印。數(shù)位數(shù)打印。 用用width()width()函數(shù)設(shè)置了域?qū)捄?,只對緊跟著它的第一個(gè)輸函數(shù)設(shè)置了域?qū)捄?,只對緊跟著它的第一個(gè)輸出有影響。而調(diào)用出有影響。而調(diào)用precision()precision()函數(shù)和函數(shù)和fill()fill()函數(shù),設(shè)置函數(shù),設(shè)置x_fillx_fill 和和x_precisionx_precision后,在程序中一直有效,除非它們被重新設(shè)置。后,在程序中一直有效,除非它們被重新設(shè)置。 當(dāng)設(shè)置了當(dāng)設(shè)置了x_
33、precisionx_precision后,當(dāng)實(shí)際輸出的小數(shù)位數(shù)大于后,當(dāng)實(shí)際輸出的小數(shù)位數(shù)大于x_precisionx_precision,則以,則以x_precisionx_precision的位數(shù)按四舍五入輸出的位數(shù)按四舍五入輸出; ;當(dāng)實(shí)際輸當(dāng)實(shí)際輸出的小數(shù)位數(shù)小于出的小數(shù)位數(shù)小于x_precisionx_precision,則按實(shí)際的小數(shù)位數(shù)輸出。,則按實(shí)際的小數(shù)位數(shù)輸出。 當(dāng)顯示數(shù)據(jù)所需的寬度比使用當(dāng)顯示數(shù)據(jù)所需的寬度比使用ios:widthios:width() ()設(shè)置的寬度小時(shí),設(shè)置的寬度小時(shí),填充字符。填充位置由填充字符。填充位置由ios:leftios:left和和ios
34、ios: right: right規(guī)定。規(guī)定。第7章 C+C+的的 I/0 I/0 流類庫流類庫 例例7 74 4如何利用控制輸入輸出格式的成員函數(shù)建立對齊的數(shù)字表。如何利用控制輸入輸出格式的成員函數(shù)建立對齊的數(shù)字表。 顯示數(shù)顯示數(shù)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; 運(yùn)行程序第7章 C+C+的的 I/0 I/0 流類庫流類庫 這個(gè)程序建立了如下的表這個(gè)程序建立了如下的表: : 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 使用操縱符進(jìn)行輸入輸出格式控制使用操縱符進(jìn)行輸入輸出格式控制 1.C1.C十十預(yù)定義的操縱符十十預(yù)定義的操縱符 ( (l) l)decdec 以十進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。以十進(jìn)制形式輸入或輸出整
38、型數(shù),可用于輸入或輸出。 (2)(2)hexhex 以十六進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。以十六進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。 (3)(3)octoct以八進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。以八進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。 (4)(4)wsws用于在輸入時(shí)跳過開頭的空白符,僅用于輸入。用于在輸入時(shí)跳過開頭的空白符,僅用于輸入。 (5)(5)endlendl插入一個(gè)換行符并刷新輸出流,僅用于輸出。插入一個(gè)換行符并刷新輸出流,僅用于輸出。 (6)(6)endsends插入一個(gè)空字符,用來結(jié)束一個(gè)字符串,僅用于輸出。插入一個(gè)空字符,用來結(jié)束一個(gè)字符
39、串,僅用于輸出。 (7)(7)flush flush 刷新一個(gè)輸出流,僅用于輸出。刷新一個(gè)輸出流,僅用于輸出。 第7章 C+C+的的 I/0 I/0 流類庫流類庫 (8)setbase(int n)(8)setbase(int n)把轉(zhuǎn)換基數(shù)設(shè)置為把轉(zhuǎn)換基數(shù)設(shè)置為n(nn(n的取值為的取值為0 0,8 8,1010或或16)16),n n的缺省值為的缺省值為0 0,即以十進(jìn)制形式輸出。,即以十進(jìn)制形式輸出。 (9)resetiosflag(long f)(9)resetiosflag(long f)關(guān)閉由參數(shù)關(guān)閉由參數(shù)f f指定的格式標(biāo)志,可用于指定的格式標(biāo)志,可用于輸入或輸出。輸入或輸出。
40、(10)setiosflags(long f)(10)setiosflags(long f)設(shè)置由參數(shù)設(shè)置由參數(shù)f f指定的格式標(biāo)志,可用于指定的格式標(biāo)志,可用于輸人或輸出輸人或輸出 。 (11)setfill(int c) c(11)setfill(int c) c為填充字符,缺省時(shí)為空格,可用于輸入或?yàn)樘畛渥址?,缺省時(shí)為空格,可用于輸入或輸出。輸出。 (12)setprecision(int n) (12)setprecision(int n) 設(shè)置數(shù)據(jù)小數(shù)部分的位數(shù),缺省時(shí)小設(shè)置數(shù)據(jù)小數(shù)部分的位數(shù),缺省時(shí)小數(shù)的位數(shù)數(shù)的位數(shù)6 6,可用于輸人或輸出,可用于輸人或輸出 (13)setw(in
41、t n) (13)setw(int n) 設(shè)置域?qū)挒樵O(shè)置域?qū)挒閚 n,可用于輸入或輸出,可用于輸入或輸出 。 第7章 C+C+的的 I/0 I/0 流類庫流類庫 操縱符操縱符 setiosflagssetiosflags() ()和和 resetiosflagsresetiosflags() ()中所用的格式標(biāo)志中所用的格式標(biāo)志: : ios:leftios:left 輸出數(shù)據(jù)按域?qū)捵髮R輸出輸出數(shù)據(jù)按域?qū)捵髮R輸出 ios:rightios:right 輸出數(shù)據(jù)按域?qū)捰覍R輸出輸出數(shù)據(jù)按域?qū)捰覍R輸出 ios:scientificios:scientific 使用科學(xué)計(jì)數(shù)法表示浮點(diǎn)數(shù)使用科學(xué)
42、計(jì)數(shù)法表示浮點(diǎn)數(shù) ios:fixedios:fixed 使用定點(diǎn)形式表示浮點(diǎn)數(shù)使用定點(diǎn)形式表示浮點(diǎn)數(shù) ios:decios:dec 轉(zhuǎn)換基數(shù)為十進(jìn)制形式轉(zhuǎn)換基數(shù)為十進(jìn)制形式 ios:hexios:hex 轉(zhuǎn)換基數(shù)為十六進(jìn)制形式轉(zhuǎn)換基數(shù)為十六進(jìn)制形式 ios:octios:oct 轉(zhuǎn)換基數(shù)為八進(jìn)制形式轉(zhuǎn)換基數(shù)為八進(jìn)制形式 ios:uppercaseios:uppercase 十六進(jìn)制形式和科學(xué)計(jì)數(shù)法輸出時(shí)十六進(jìn)制形式和科學(xué)計(jì)數(shù)法輸出時(shí), , 表示數(shù)值的字符一律為大寫表示數(shù)值的字符一律為大寫 ios:showbaseios:showbase 輸出帶有一個(gè)表示制式的字符輸出帶有一個(gè)表示制式的字符 i
43、os:showposios:showpos 在正數(shù)前添加一個(gè)在正數(shù)前添加一個(gè)”十十”號(hào)號(hào) ios:showpointios:showpoint 浮點(diǎn)輸出時(shí)對必須帶有一個(gè)小數(shù)點(diǎn)浮點(diǎn)輸出時(shí)對必須帶有一個(gè)小數(shù)點(diǎn)第7章 C+C+的的 I/0 I/0 流類庫流類庫 操縱符的使用操縱符的使用 不帶參數(shù)的操縱符在不帶參數(shù)的操縱符在iostreamiostream h h 文件中定義,帶文件中定義,帶參數(shù)的在參數(shù)的在iomanipiomanip h h 文件中定義。在進(jìn)行輸入輸出文件中定義。在進(jìn)行輸入輸出時(shí)時(shí) ,操縱符被嵌人到輸人或輸出鏈中,用來控制輸入,操縱符被嵌人到輸人或輸出鏈中,用來控制輸入輸出的格式,
44、而不是執(zhí)行輸入或輸出操作輸出的格式,而不是執(zhí)行輸入或輸出操作 。第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; ; 運(yùn)行程序第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 流類庫流類庫 程序運(yùn)行結(jié)果為程序運(yùn)行結(jié)果為: : 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 顯示數(shù)顯示數(shù)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; 運(yùn)行程序第7章 C+C+的的 I/0 I/0 流類庫流類庫 3 3用戶自定義的操縱符用戶自定義的操縱符 (1)(1) 輸出流定義操縱
49、符函數(shù)輸出流定義操縱符函數(shù): : ostreamostream & &manip_name(ostreammanip_name(ostream &stream) &stream) / /自定義代碼自定義代碼 return stream;return stream; (2) (2)輸入流定義操縱符函數(shù)輸入流定義操縱符函數(shù): : istreamistream & &manip_name(istreammanip_name(istream &stream) &stream) / /自定義代碼自定義代碼 return stream;ret
50、urn stream; 式中,式中,manip_namemanip_name是操縱符函數(shù)的名字,其它單詞是操縱符函數(shù)的名字,其它單詞可照原樣寫上。在此,操縱符返回可照原樣寫上。在此,操縱符返回stream(stream(也可用其它標(biāo)也可用其它標(biāo)識(shí)符識(shí)符) )是一個(gè)關(guān)鍵,否則操縱符就不能用在流的輸入輸出是一個(gè)關(guān)鍵,否則操縱符就不能用在流的輸入輸出操作序列中。操作序列中。第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; 運(yùn)行程序第7章
52、 C+C+的的 I/0 I/0 流類庫流類庫 程序運(yùn)行結(jié)果如程序運(yùn)行結(jié)果如 下下 : : 123 123 7b& 7b&第7章 C+C+的的 I/0 I/0 流類庫流類庫 該程序建立了一個(gè)操縱符函數(shù)該程序建立了一個(gè)操縱符函數(shù)outputloutputl,其功能為其功能為: :設(shè)置左對齊格式標(biāo)志,把域?qū)捴迷O(shè)置左對齊格式標(biāo)志,把域?qū)捴脼闉?1010,整數(shù)按,整數(shù)按16 16 進(jìn)制輸出,填空字符為進(jìn)制輸出,填空字符為&。在。在 main()main()函數(shù)中引用諒函數(shù)時(shí),只寫函數(shù)中引用諒函數(shù)時(shí),只寫 outputloutputl 即可。其調(diào)用方法與預(yù)定義操縱即可。其調(diào)用方法與
53、預(yù)定義操縱符,如符,如 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; 運(yùn)行程序第7章 C+C
54、+的的 I/0 I/0 流類庫流類庫 7 74 4 用戶自定義類型的輸入輸出用戶自定義類型的輸入輸出 通過重載運(yùn)算符通過重載運(yùn)算符來實(shí)現(xiàn)。來實(shí)現(xiàn)。 7 74 41 1 重載輸出運(yùn)算符重載輸出運(yùn)算符 ostream &operator(ostream &stream,class_name obj) /操作代碼操作代碼 return stream; 函數(shù)中第一個(gè)參數(shù)是對函數(shù)中第一個(gè)參數(shù)是對ostreamostream對象的引用。這意味著對象的引用。這意味著streamstream必須是輸出流必須是輸出流( (注意注意: :ostreamostream是在是在iosios內(nèi)部定義的內(nèi)
55、部定義的) ),它可,它可以是其它任何合法的標(biāo)識(shí)符,但必須與以是其它任何合法的標(biāo)識(shí)符,但必須與returnreturn后面的標(biāo)識(shí)符相后面的標(biāo)識(shí)符相同。第二個(gè)參數(shù)接收將被輸出的對象,其中同。第二個(gè)參數(shù)接收將被輸出的對象,其中class_nameclass_name是類名,是類名,objobj為該類的對象名。為該類的對象名。第7章 C+C+的的 I/0 I/0 流類庫流類庫 7 79 9 輸出運(yùn)算符輸出運(yùn)算符重載的例子重載的例子#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 流類庫流類庫 程序運(yùn)行結(jié)果如下程序運(yùn)行結(jié)果如下: 5,6 10,34運(yùn)行程序第7章 C+C+的的 I/0 I/0 流類庫流類庫 一般情況下,一般情況下,重載輸出運(yùn)算符函數(shù)及重載輸重載輸出運(yùn)算符函數(shù)及重載輸入運(yùn)算符函數(shù)都不能是類的成員入運(yùn)算符函數(shù)都不能是類的成員, ,應(yīng)該定義為類的應(yīng)該定義為類的友元函數(shù)。友元函數(shù)。 因?yàn)槿绻粋€(gè)運(yùn)算符函數(shù)是類的成員,則其因?yàn)槿绻粋€(gè)運(yùn)算符函數(shù)是類的成員,則其左運(yùn)算數(shù)就應(yīng)當(dāng)是調(diào)用運(yùn)算符函數(shù)的類的對象,左運(yùn)算數(shù)就應(yīng)當(dāng)是調(diào)用運(yùn)算符函數(shù)的類的
58、對象,而且這一點(diǎn)是無法改變的。但重載輸出運(yùn)算符時(shí),而且這一點(diǎn)是無法改變的。但重載輸出運(yùn)算符時(shí),其左邊的參數(shù)是流,而右邊參數(shù)是類的對象。因其左邊的參數(shù)是流,而右邊參數(shù)是類的對象。因此,重載輸出運(yùn)算符必須是非成員函數(shù)。此,重載輸出運(yùn)算符必須是非成員函數(shù)。 第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; 與重載輸出運(yùn)算符函數(shù)一樣,重載輸入運(yùn)算符與重載輸出運(yùn)算符函數(shù)一樣,重載輸入運(yùn)算符函數(shù)也不能是所操作的類的成員函數(shù),但可以是該函數(shù)也不能是所操作的類的成員函數(shù),但可以是該類的友元函數(shù)或獨(dú)立函數(shù)。類的友元函數(shù)或獨(dú)立函數(shù)。第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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度城市基礎(chǔ)設(shè)施建設(shè)債權(quán)轉(zhuǎn)讓與融資合同
- 2025年度商鋪轉(zhuǎn)讓三方合同附帶品牌授權(quán)與培訓(xùn)支持
- 2025年度石料場生產(chǎn)承包環(huán)境保護(hù)與修復(fù)責(zé)任合同
- 2025年度教育培訓(xùn)機(jī)構(gòu)兼職正式聘用教學(xué)合同
- 2025年度購房合同解除補(bǔ)償協(xié)議范文
- 2025年度農(nóng)村出租房租賃與農(nóng)村養(yǎng)老服務(wù)業(yè)合作合同
- 二零二五年度股權(quán)代持協(xié)議書:文化娛樂股權(quán)代持與IP開發(fā)合作合同
- 2025年旅游行業(yè)現(xiàn)狀分析:國內(nèi)旅游人次預(yù)計(jì)達(dá)到63億
- 2024-2025學(xué)年北京市二中高三上學(xué)期期中調(diào)研生物試卷
- 2025年吉林省吉林市單招職業(yè)適應(yīng)性測試題庫匯編
- 2024年青島港灣職業(yè)技術(shù)學(xué)院高職單招數(shù)學(xué)歷年參考題庫含答案解析
- 《信息技術(shù)(拓展模塊)》高職全套教學(xué)課件
- 環(huán)保行業(yè)環(huán)保管理制度環(huán)保責(zé)任落實(shí)制度
- 2025年山東菏投建設(shè)集團(tuán)招聘筆試參考題庫含答案解析
- 市政質(zhì)量員繼續(xù)教育考試題庫集(含答案)
- 售后工程師述職報(bào)告
- 《公司法完整版》課件2024
- 2024年下半年信息系統(tǒng)項(xiàng)目管理師真題及答案
- ??低曤娏π袠I(yè)系統(tǒng)解決方案
- 2024-2030年中國街舞培訓(xùn)行業(yè)發(fā)展趨勢及競爭格局分析報(bào)告
- 期末練習(xí)卷(模擬試題)-2024-2025學(xué)年 一年級(jí)上冊數(shù)學(xué)人教版
評論
0/150
提交評論