




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章 流類庫(kù)與輸入/輸出第第9章章 流類庫(kù)與輸入流類庫(kù)與輸入/輸出輸出 9.1 輸入輸入/輸出標(biāo)準(zhǔn)流類輸出標(biāo)準(zhǔn)流類9.2 文件流類文件流類9.3 串流類串流類9.4 控制符控制符第9章 流類庫(kù)與輸入/輸出9.1 輸入輸入/輸出標(biāo)準(zhǔn)流類輸出標(biāo)準(zhǔn)流類 9.1.1 輸入/輸出流的概念 就像C語(yǔ)言一樣,C+語(yǔ)言中也沒(méi)有輸入/輸出語(yǔ)句。C+的I/O是以字節(jié)流的形式實(shí)現(xiàn)的,每一個(gè)C+編譯系統(tǒng)都帶有一個(gè)面向?qū)ο蟮妮斎?輸出軟件包,這就是I/O流類庫(kù)。其中,流是I/O流類的中心概念。到目前為止,我們一直在使用它。第9章 流類庫(kù)與輸入/輸出 所謂流,是指數(shù)據(jù)從一個(gè)對(duì)象流向另一個(gè)對(duì)象。在C+程序中,數(shù)據(jù)可以從鍵
2、盤流入到程序中,也可以從程序中流向屏幕或磁盤文件,把數(shù)據(jù)的流動(dòng)抽象為“流”。流在使用前要被建立,使用后要被刪除,還要使用一些特定的操作從流中獲取數(shù)據(jù)或向流中添加數(shù)據(jù)。從流中獲取數(shù)據(jù)的操作稱為提取操作,向流中添加數(shù)據(jù)的操作稱為插入操作。第9章 流類庫(kù)與輸入/輸出 流實(shí)際上就是一個(gè)字節(jié)序列。在輸入操作中,字節(jié)從輸入設(shè)備(如鍵盤、磁盤、網(wǎng)絡(luò)連接等)流向內(nèi)存;在輸出操作中,字節(jié)從內(nèi)存流向輸出設(shè)備(如顯示器、打印機(jī)、磁盤、網(wǎng)絡(luò)連接等)。如圖9-1所示。在C+語(yǔ)言中,針對(duì)流的特點(diǎn),提供了如圖9-2所示的層次結(jié)構(gòu)來(lái)描述流的行為,并給出了I/O流類庫(kù)的操作。 第9章 流類庫(kù)與輸入/輸出第9章 流類庫(kù)與輸入/輸
3、出圖9-2 輸入/輸出流類層次圖 第9章 流類庫(kù)與輸入/輸出 表9-1 I/O流類列表 第9章 流類庫(kù)與輸入/輸出 9.1.2 輸入/輸出標(biāo)準(zhǔn)流類 1標(biāo)準(zhǔn)流的設(shè)備名 由表9-1可見,I/O流的標(biāo)準(zhǔn)頭文件是iostream.h。其中,ostream類通過(guò)其派生類ostream_withassign支持以下預(yù)先定義的流對(duì)象: cout:標(biāo)準(zhǔn)輸出。默認(rèn)設(shè)備為屏幕。 cerr:標(biāo)準(zhǔn)錯(cuò)誤輸出。沒(méi)有緩沖,發(fā)送給它的內(nèi)容立即被輸出,默認(rèn)設(shè)備為屏幕。第9章 流類庫(kù)與輸入/輸出 clog:標(biāo)準(zhǔn)錯(cuò)誤輸出。有緩沖,當(dāng)緩沖區(qū)滿時(shí)被輸出,默認(rèn)設(shè)備為打印機(jī)。 而istream類通過(guò)其派生類istream_withassi
4、gn支持預(yù)先定義的對(duì)象。 cin:標(biāo)準(zhǔn)輸入。默認(rèn)設(shè)備為鍵盤。第9章 流類庫(kù)與輸入/輸出 2原理 cout是ostream類的全局對(duì)象,它在頭文件iostream.h中的定義如下: ostream cout(stdout); /這里,stdout作為該對(duì)象構(gòu)造時(shí)的參數(shù)對(duì)應(yīng)每種基本數(shù)據(jù)類型,ostream類都存在友元,它們都在iostream.h中聲明。例如: ostream& operator(int n); ostream& operator(float f); ostream& operator(const char*psz); /.第9章 流類庫(kù)與輸入/輸出 如語(yǔ)句
5、: coutHow old are you? ; cout是類ostream的對(duì)象,( int &n); istream& operator( float &f); istream& operator( char*psz); /.第9章 流類庫(kù)與輸入/輸出9.2 文件流類文件流類 fstream、ifstream和ofstream是文件流類,在頭文件fstream.h中定義。其中,fstream是ofstream和ifstream多重繼承的子類。文件流類不是標(biāo)準(zhǔn)設(shè)備,沒(méi)有cout那樣預(yù)先定義的全局對(duì)象。文件流類支持對(duì)磁盤文件的操作。要定義一個(gè)文件流類對(duì)象,須指定
6、文件名和打開方式。 第9章 流類庫(kù)與輸入/輸出類ofstream用于執(zhí)行文件輸出,該類有以下幾個(gè)構(gòu)造函數(shù):ofstream:ofstream( fd );ofstream:ofstream( fd, char*pch, int nLength );ofstream:ofstream( const char*szName, int nMode = ios:out, int nProt = :openprot );第9章 流類庫(kù)與輸入/輸出類ifstream用于執(zhí)行文件輸入,該類有以下幾個(gè)構(gòu)造函數(shù):ifstream:ifstream( fd );ifstream:ifstream( fd, cha
7、r*pch, int nLength );ifstream:ifstream( const char*szName, int nMode = ios:in, int nProt = :openprot );第9章 流類庫(kù)與輸入/輸出 其中最常用的都是最后一個(gè)構(gòu)造函數(shù)。該函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)是指向要打開的文件名的字符串,后兩個(gè)參數(shù)指定文件的打開模式。文件打開模式的具體標(biāo)志見表9-2??梢杂冒次籓R(|)運(yùn)算符組合這些標(biāo)志,它們作為枚舉器定義在ios類中。第9章 流類庫(kù)與輸入/輸出 表9-2 文件打開模式 第9章 流類庫(kù)與輸入/輸出 打開一個(gè)輸出文件,用于在文件尾添加數(shù)據(jù) 打開一個(gè)現(xiàn)存文件(
8、用于輸入或輸出)并查找到結(jié)尾 打開一個(gè)輸入文件。對(duì)于一個(gè)ofstream文件,使用ios:in作為一個(gè)openmode,可避免刪除一個(gè)現(xiàn)存文件中現(xiàn)有的內(nèi)容 打開一個(gè)文件,用于輸出。對(duì)于所有ofstream對(duì)象,此模式是隱含指定的 如果一個(gè)文件存在,則打開它;否則該操作失敗第9章 流類庫(kù)與輸入/輸出 如果一個(gè)文件不存在,則作為新文件打開它;如果文件已存在,則該操作失敗 打開一個(gè)文件。如果它已經(jīng)存在,則刪除其中原有的內(nèi)容。如果指定了ios:out,但沒(méi)有指定ios:ate、ios:app和ios:in,則隱含為此模式 以二進(jìn)制模式打開一個(gè)文件(默認(rèn)是文本模式) Nprot是文件保護(hù)方式,它的標(biāo)志如
9、表9-3。第9章 流類庫(kù)與輸入/輸出 表9-3 文件保護(hù)方式 第9章 流類庫(kù)與輸入/輸出【例9-1】 向文件myfile中寫入一些信息。#includevoid main( )ofstream fc(c:tempmyfile);fcConstructs an ofstream object.nAll ofstream constructors construct a object. n;第9章 流類庫(kù)與輸入/輸出 注意: 這里的文件名要說(shuō)明其路徑,要使用雙斜杠,因?yàn)镃+編譯器理解單斜杠為字符轉(zhuǎn)換符。 在文件打開時(shí),匹配了構(gòu)造函數(shù)ofstream:ofstream(char*),只需要一個(gè)文件名
10、,其它為默認(rèn)。打開方式默認(rèn)為ios:out | ios:trunc,即該文件用于接受程序的輸出。如果該文件已存在,則其內(nèi)容必須先清除,否則就新建。第9章 流類庫(kù)與輸入/輸出如果要檢查文件是否打開,則須判斷成員函數(shù)fail( ):#include void func( ) ofstream fc(myfile); if(fc.fail( ) /fail( )= =1 cerrerror opening filen; return; fca; coutaendl; 輸出結(jié)果為 H第9章 流類庫(kù)與輸入/輸出【例9-2】 使用串流輸入對(duì)字符串中的數(shù)據(jù)進(jìn)行解讀。#include#includechar*
11、ioString(char*);void main( )char*str=100 123.456;char*Buf0=ioString(str);coutBuf0iNumberfNumber; /從串流中讀入一個(gè)整數(shù)和浮點(diǎn)數(shù)char*Buf1=new char28;ostrstream outS(Buf1,28);outSiNumber=iNumber,fNumber=fNumberendl;return Buf1;第9章 流類庫(kù)與輸入/輸出 程序運(yùn)行結(jié)果為 iNumber=100,fNumber=123.456 分析:在函數(shù)ioString( )中,以pString為輸入設(shè)備,先定義一個(gè)輸入
12、串流對(duì)象inS,從中輸入一個(gè)整數(shù)和一個(gè)浮點(diǎn)數(shù)。再開辟一個(gè)字符串空間作為輸出設(shè)備,定義一個(gè)輸出串流對(duì)象outS,將從輸入設(shè)備輸入的兩個(gè)變量的值輸出。第9章 流類庫(kù)與輸入/輸出9.4 控制符控制符 9.4.1 使用流對(duì)象的成員函數(shù)【例9-3】 使用width成員函數(shù)控制輸出寬度。 #include void main( ) double values =1.44,36.47,625.7,4096.24; for(int i=0;i4;i+) 第9章 流類庫(kù)與輸入/輸出cout.width(10); coutvaluesin;程序運(yùn)行結(jié)果為 1.4436.47625.74096.24第9章 流類庫(kù)與
13、輸入/輸出 此例子在一列中以至少10個(gè)字符寬按右對(duì)齊方式輸出數(shù)據(jù)。從程序的輸出結(jié)果可以看到,在少于10個(gè)字符寬的數(shù)值前加入了引導(dǎo)空格。 空格是默認(rèn)的填充符,當(dāng)輸出的數(shù)據(jù)不能充滿指定的寬度時(shí),系統(tǒng)會(huì)自動(dòng)以空格填充。另外,還可以使用fill成員函數(shù)為已經(jīng)指定寬度的域設(shè)置填充字符的值。為了用星號(hào)填充數(shù)值列,我們可以將例9-3中的for循環(huán)修改如下:第9章 流類庫(kù)與輸入/輸出for(int i=0;i4;i+) cout.width(10); cout.fill(*); coutvaluesiendl; 其輸出結(jié)果為*1.44*36.47*625.7*4096.24第9章 流類庫(kù)與輸入/輸出 9.4.
14、2 使用控制符 C+的輸入/輸出流類庫(kù)提供了一些控制符,可以直接嵌入到輸入/輸出語(yǔ)句中來(lái)實(shí)現(xiàn)對(duì)I/O格式的控制。它的優(yōu)點(diǎn)是程序可以直接將控制符插入流中,而不必單獨(dú)調(diào)用。表9-4中列出了常用的I/O流類庫(kù)控制符。 第9章 流類庫(kù)與輸入/輸出表9-4 常用的I/O流類庫(kù)控制符第9章 流類庫(kù)與輸入/輸出第9章 流類庫(kù)與輸入/輸出【例9-4】 使用setw控制符指定寬度。#include#includevoid main( )double values =1.44,36.47,625.7,4096.24;char*names =Rose,John,Alice,Mary;for(int i=0;i4;i
15、+)第9章 流類庫(kù)與輸入/輸出 coutsetw(6)namesisetw(10)valuesiendl; width成員函數(shù)在頭文件iostream.h中說(shuō)明。 如果帶參量使用setw(n)或任何其它控制符,還必須包括頭文件iomanip.h。在輸出中,字符串輸出在寬度為6的域中,整數(shù)輸出在寬度為10的域中。程序運(yùn)行結(jié)果為 Rose 1.44 John 36.47 Alice 625.7 Mary 4096.24第9章 流類庫(kù)與輸入/輸出 setw和width都不截?cái)鄶?shù)值。如果一個(gè)數(shù)值需要比set(n)確定的字符數(shù)更多的字符,則該值將使用它所需要的所有字符。當(dāng)然,還要遵守該流的精度設(shè)置。se
16、tw和width僅影響緊隨其后的域,即使用setw和width設(shè)置的間隔方式并不保留其效力。在一個(gè)域輸出完后,域?qū)挾然謴?fù)成它的默認(rèn)值 (必要的寬度),但其它流格式選項(xiàng)保持有效直到發(fā)生改變。第9章 流類庫(kù)與輸入/輸出例如,下面的程序代碼:/.cout setiosflags(ios:right) /設(shè)置為默認(rèn)的右對(duì)齊方式,setw(5)1setw(5)2setw(5)3endl;cout setiosflags(ios:left)/設(shè)置成左對(duì)齊方式 第9章 流類庫(kù)與輸入/輸出 setw(5)1 setw(5)2 setw(5)3endl; coutresetiosflags(ios:left)
17、/關(guān)閉左對(duì)齊標(biāo)志 /. 這段程序代碼中,是通過(guò)使用帶參數(shù)的setiosflags控制符來(lái)設(shè)置左、右對(duì)齊,參數(shù)是ios:left和ios:right枚舉器。 第9章 流類庫(kù)與輸入/輸出 該枚舉器定義在ios類中,因此,引用時(shí)必須包括ios:前綴。這里需要用resctiosflags操縱符關(guān)閉左、右對(duì)齊標(biāo)志。setiosflags不同于width和setw,它的影響是持久的,直到用resetiosflags重新恢復(fù)默認(rèn)值時(shí)為止。 這段程序代碼的輸出結(jié)果為 1 2 3 1 2 3 常用控制符和流格式控制成員函數(shù)如表9-5所示。 第9章 流類庫(kù)與輸入/輸出表9-5 常用控制符和流成員函數(shù) 第9章 流類
18、庫(kù)與輸入/輸出9.5 輸入輸入/輸出成員函數(shù)輸出成員函數(shù) 9.5.1 使用成員函數(shù)輸入 1getline( )函數(shù) 在程序使用cin輸入時(shí),cin用空白符和行結(jié)束符將各個(gè)值分開。有時(shí)候輸入可能需要讀取一整行文本并且分開不同的域,為此,我們可以使用getline成員函數(shù)。其函數(shù)原型如下: istream&getline( char*pch, int nCount, char delim = n );第9章 流類庫(kù)與輸入/輸出 其中,第一個(gè)參數(shù)是字符數(shù)組,用于放置讀取的文本;第二個(gè)參數(shù)是本次讀取的最大字符個(gè)數(shù);第三個(gè)參數(shù)是分隔字符,作為讀取一行結(jié)束的標(biāo)志。 getline成員函數(shù)的功能是允
19、許從輸入流中讀取多個(gè)字符 (包括空白字符和行結(jié)束符),并且允許指定輸入終止字符 (默認(rèn)值是換行字符)。在讀取完成后,從讀取的內(nèi)容中刪除該終止字符。 第9章 流類庫(kù)與輸入/輸出 【例9-5】 為輸入流指定一個(gè)終止字符。 本程序連續(xù)讀入一串字符,直到遇到字符t時(shí)停止,字符個(gè)數(shù)最多不超過(guò)99個(gè)。程序中的t是大小寫敏感的。 #include void main( ) char line100; coutType a line terminated by tendl; cin.getline(line,100,t); coutlineendl; 第9章 流類庫(kù)與輸入/輸出 2get( )函數(shù) 在輸入時(shí),
20、有些時(shí)候需要執(zhí)行每次只輸入單個(gè)字符的操作,我們可以使用get( )成員函數(shù)來(lái)完成。get( )函數(shù)的格式如下: char istream:get( ); 【例9-6】 循環(huán)讀入字符,直到鍵入一個(gè)y字符,或遇到文件尾。 #include void main( ) char letter; while(!cin.eof( )第9章 流類庫(kù)與輸入/輸出letter=cin.get( );if(letter=y)coutybe met!;break;coutletter;第9章 流類庫(kù)與輸入/輸出 get( )函數(shù)還有一種形式可以輸入一系列字符,直到輸入流中出現(xiàn)結(jié)束符或所讀字符個(gè)數(shù)已達(dá)到要求讀的字符個(gè)
21、數(shù)。這時(shí),get( )函數(shù)的函數(shù)原型如下: istream&istream:get(char*,int n,char delim=n);第9章 流類庫(kù)與輸入/輸出 例如,下面程序輸入一系列字符,將前24個(gè)字符輸出。 #include void main( ) char line25; cout ; cin.get( line, 25 ); cout line; 第9章 流類庫(kù)與輸入/輸出 9.5.2 使用成員函數(shù)輸出 【例9-7】 使用put( )成員函數(shù),在屏幕上顯示字母表中的字母。 #include void main( ) char letter; for(letter=A;le
22、tter=Z;letter+) cout.put(letter); 第9章 流類庫(kù)與輸入/輸出程序運(yùn)行結(jié)果為ABCDEFGHIJKMNOPQRSTUVWXYZ也可以像下面那樣在一條語(yǔ)句中連續(xù)調(diào)用put( )函數(shù):cout.put(A).put(n);該語(yǔ)句在輸出字符A后輸出一個(gè)新?lián)Q行符。還可以用ASCII碼值表達(dá)式調(diào)用put( )函數(shù):cout.put(65);該語(yǔ)句也輸出字符A。 第9章 流類庫(kù)與輸入/輸出9.6 用戶自定義類型的輸入用戶自定義類型的輸入/輸出輸出【例9-8】 用戶自定義的插入運(yùn)算符和提取運(yùn)算符。 #include class PhoneNumber private: char nationCode4; char areaCode4; char phoneCode8; 第9章 流類庫(kù)與輸入/輸出public:friend ostream& operator(istream&,PhoneNumber&);ostream& operator(ostream& output,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 同城轉(zhuǎn)租 店鋪合同范例
- 雙工作合同范本
- 雙方合資協(xié)議合同范本
- 加工承攬合同范本新
- 勞務(wù)短期合同范本
- 廚柜代銷合同范本
- 租賃合同變更服務(wù)合同范本
- 印刷產(chǎn)品定做合同范本
- 大件搬運(yùn)服務(wù)合同范本
- 合作傭金合同范本
- (完整版)第五章養(yǎng)殖場(chǎng)環(huán)境保護(hù)
- 祖國(guó)版圖知識(shí)主題班會(huì)
- 2025年上半年?yáng)|方電氣集團(tuán)科學(xué)技術(shù)研究院限公司公開招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 征信異議申請(qǐng)書
- 高中不同主題閱讀理解高頻詞匯清單-2025屆高三下學(xué)期英語(yǔ)一輪復(fù)習(xí)專項(xiàng)
- 2025年上半年高郵市國(guó)資產(chǎn)投資運(yùn)營(yíng)限公司(國(guó)企業(yè))公開招聘工作人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年高考地理二輪復(fù)習(xí):地球運(yùn)動(dòng)(講義)解析版
- 2024年金華金開招商招才服務(wù)集團(tuán)有限公司招聘筆試真題
- 【地理】亞洲的自然環(huán)境第3課時(shí) 2024-2025學(xué)年七年級(jí)地理下冊(cè)同步課件(人教版2024)
- 2024年江蘇護(hù)理職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 《國(guó)別和區(qū)域研究專題》教學(xué)大綱
評(píng)論
0/150
提交評(píng)論