版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十九章 I/O流,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,有關(guān)輸入、輸出操作并沒(méi)有在C+語(yǔ)言中定義,但它包含在C+的實(shí)現(xiàn)中,并作為C+的一個(gè)標(biāo)準(zhǔn)庫(kù) iostream類庫(kù)提供。,為什么要有C+流類庫(kù),非類型安全問(wèn)題,#include int j=10; float f=6.98; main() printf(%d,f); scanf(%d, ,為什么要有C+流類庫(kù),C語(yǔ)言的輸入輸出系統(tǒng)不支持用戶自定義的對(duì)象或數(shù)據(jù)類型,如一定義: struct sample int i ; float f; cha
2、r *ch; s1; 不能用輸出函數(shù)來(lái)輸出以上結(jié)構(gòu)變量: printf(“%sample”,s1);,C+中,用戶自定義的對(duì)象很多。C+的類機(jī)制允許它可以建立一個(gè)可控制的輸入輸出系統(tǒng)。可以通過(guò)重載“”運(yùn)算符來(lái)解決以上的問(wèn)題。,流類庫(kù)和流,流 C+的I/O是以字節(jié)流的形式實(shí)現(xiàn)的,流實(shí)際上就是一個(gè)字節(jié)序列。 每個(gè)流都和一種與設(shè)備相聯(lián)系。 與輸入設(shè)備(如鍵盤)聯(lián)系的流為輸入流;與輸出設(shè)備(如屏幕)聯(lián)系的流為輸出流。,流類庫(kù)和流,C+的iostream類庫(kù)是提供一組類,程序利用它們可以方便的與外部世界交換數(shù)據(jù). C+的iostream類庫(kù)是用繼承的方法建立起來(lái)的一個(gè)輸入輸出類庫(kù)。 iostream類庫(kù)
3、有兩個(gè)基類,即streambuf類和ios類。 streambuf類提供對(duì)緩沖區(qū)的低級(jí)操作,如緩沖區(qū)的設(shè)置、緩沖區(qū)的讀寫等。 ios類用來(lái)完成檢查錯(cuò)誤的格式化輸入、輸出。,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,C+語(yǔ)言為實(shí)現(xiàn)數(shù)據(jù)的輸入輸出定義了許多復(fù)雜的類,這些類都以ios為基類,其余都是它的直接或間接派生類。這些類以及它們之間的關(guān)系如圖所示。,ios istream istrstream istream_withassign ifstream ostream ostrstream ostrea
4、m_withassign ofstream,iostream fstream strstream stdiostream,每種類標(biāo)識(shí)符代表的含義如下: ios:根基類 istream:輸入流類 ostream:輸出流類 fstreambase:文件流基類 strstreambase:字符串流基類 ifstream:輸入文件流類 ofstream:輸出文件流類 istrstream:輸入字符串流類 ostrstream:輸出字符串流類 iostream:輸入輸出流類 fstream:輸入輸出文件流類 strstream: 輸入輸出字符串流類,I/O流類層次,class ios; class is
5、tream: virtual public ios; class ostream: virtual public ios; class iostream: public istream,public ostream;,C+中定義了四個(gè)標(biāo)準(zhǔn)流對(duì)象 cin 一個(gè)istream類的對(duì)象,用于處理標(biāo)準(zhǔn)輸入 cout 一個(gè)ostream類的對(duì)象,用于處理標(biāo)準(zhǔn)輸出 cerr 一個(gè)ostream類的對(duì)象,用于處理標(biāo)準(zhǔn)錯(cuò)誤輸出,沒(méi)有緩沖,發(fā)給它的內(nèi)容立即輸出。 clog 類似于cerr,但有緩沖,緩沖區(qū)滿時(shí)被輸出.,在類ostream中,對(duì)“”運(yùn)算符進(jìn)行了重載: ostream,在缺省情況下,標(biāo)準(zhǔn)輸出設(shè)備是顯
6、示終端,標(biāo)準(zhǔn)輸入設(shè)備是鍵盤。 在任何情況下,標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備總是顯示終端。 標(biāo)準(zhǔn)輸出設(shè)備可以不是顯示終端;但錯(cuò)誤信息總是在顯示屏幕上顯示。,#include void fn(int a,int b) if(b = 0) cerr “zero encountered.” else cout a/b endl; void main() fn(20,2); fn(20,0);,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,文件,C+把文件看成是由數(shù)據(jù)序列組成的。 根據(jù)數(shù)據(jù)的組織形式,文件可以分為文本文件和二進(jìn)
7、制文件。 文本文件也稱ASCII文件,每個(gè)字節(jié)存放一個(gè)ASCII字符。 二進(jìn)制文件是將數(shù)據(jù)按在內(nèi)存中的存儲(chǔ)形式存放到磁盤上。 一般二進(jìn)制文件占用的空間比較少。 如:整數(shù)100000只要4個(gè)字節(jié)。,C+中與文件處理相關(guān)的三個(gè)類: 類 ifstream 執(zhí)行文件的輸入操作 類 ofstream 執(zhí)行文件的輸出操作 類 fstream 執(zhí)行文件的輸入/輸出操作,在C+中,要進(jìn)行文件的輸入輸出操作,應(yīng)該: 先創(chuàng)建一個(gè)流對(duì)象 ofstream( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot ); 進(jìn)行文件的讀寫
8、操作 關(guān)閉文件,文件打開方式: ios:ate:到輸入或輸出文件的文件尾 ios:in: 打開輸入文件(ifstream 默認(rèn)) ios:out: 打開輸出文件(ofstream 默認(rèn)) ios:nocreate :如果文件不存在,返回錯(cuò)誤ios:noreplace : 如果文件已存在,返回錯(cuò)誤 ios:trunc : 如文件存在,清除文件內(nèi)容 ios:binary : 以二進(jìn)制模式打開文件,文件保護(hù)方式選擇項(xiàng) 標(biāo)志 含義 filebuf:openprot 兼容共享方式 filebuf:sh_none 獨(dú)占,不共享 filebuf:sh_read 允許讀共享 filebuf:sh_write
9、允許寫共享,#include int main() ofstream fout(c:data.dat); if(! fout) cerrCant open file n; return 1; fout10 123.456This is a file.n; fout.close(); return 0; ,#include int main() int x; ifstream fin(c:data.dat); if(fin.fail() cerrx; coutxendl; fin.close(); return 0; ,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用
10、I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,I/O流庫(kù)提供了用字符數(shù)組輸入輸出信息的操作。 ostrstream 用于將信息輸出至字符數(shù)組 istrstream 用于從字符數(shù)組輸入信息 strstream,istrstream: istrstream(const char* str) istrstream: istrstream(const char* str,int size) ostrstream: ostrstream(char *,int size,int=ios:out),#include char* parseString(char* pString) istrs
11、tream inp(pString,0); int aNumber; float balance; inpaNumberbalance; char* pBuffer = new char128; ostrstream outp(pBuffer,128); outpa Number=aNumber, balance=balance; return pBuffer; ,void main() char* str = 1234 100.35; char* pBuf=parseString(str); coutpBufendl; delete pBuf; ,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù)
12、 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,C+中提供了兩種進(jìn)行格式控制的方法: 用ios類成員函數(shù)進(jìn)行格式化 用控制符進(jìn)行格式化控制,用ios類成員函數(shù)進(jìn)行格式化,設(shè)置域?qū)捄瘮?shù) width(int wid) 設(shè)置精度函數(shù) precision(int p) 設(shè)置填充字符函數(shù) fill(char c),用控制符進(jìn)行格式化控制,控制符是以一個(gè)流引用作為參數(shù),并返回同一流的引用,因此它可以直接嵌入到插入流中。 C+中提供了一些標(biāo)準(zhǔn)控制符和標(biāo)準(zhǔn)控制符函數(shù)。,示例:ASCII碼表,#include #include int main() int i,j=
13、0; for(i=32;i127;i+) cout setw(4) hexi H setw(2) char(i); j+; if (j%8=0) coutendl; return 0; ,程序運(yùn)行結(jié)果: 20H 21H ! 22H 23H # 24H $ 25H % 26H 3cH 3fH ? 40H 41H A 42H B 43H C 44H D 45H E 46H F 47H G 48H H 49H I 4aH J 4bH K 4cH L 4dH M 4eH N 4fH O 50H P 51H Q 52H R 53H S 54H T 55H U 56H V 57H W 58H X 59H
14、Y 5aH Z 5bH 5cH 5dH 5eH 5fH _ 60H 61H a 62H b 63H c 64H d 65H e 66H f 67H g 68H h 69H i 6aH j 6bH k 6cH l 6dH m 6eH n 6fH o 70H p 71H q 72H r 73H s 74H t 75H u 76H v 77H w 78H x 79H y 7aH z 7bH 7cH | 7dH 7eH ,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,常見(jiàn)流對(duì)象的成員函數(shù)有: precision
15、( ) 設(shè)置顯示小數(shù)精度,用于cout width( ) 設(shè)置域?qū)?,用于cout flags( ) 設(shè)置基數(shù)和填充字符,用于cout get( ) 讀取一個(gè)字符,用于cin getline( ) 讀取一行字符,用于cin read( ) 讀取一個(gè)字符串,用于cin put( ) 輸出一個(gè)字符,用于cout write( ) 輸出一個(gè)字符串,用于cout,輸入流的get()函數(shù) 功能: 與“”相像.但get函數(shù)在讀入數(shù)據(jù)時(shí)包括空白字符,而“”在缺省時(shí)拒絕接受. 形式: int get(); istream istream while(!cin.eof() letter=cin.get(); le
16、tter=toupper(letter); if(letter=Y) cout y be metendl; break; coutletter; 備注: CIN操作這種情況通常是按下回車后才開始輸入,int main() char c; const int SIZE = 80; char buffer1SIZE,buffer2SIZE; coutbuffer1; coutn The string read with cin was:n buffer1n; cin.get(buffer2,SIZE); coutThe string read with cin.get was:n buffer2e
17、ndl; return 0; ,#include void main() ifstream fin(c:abc.dat); char buffer80; finbuffer; ,void main() ifstream fin(c:abc.dat); char buffer80; fin.get(buffer,80); ,輸入流的getline函數(shù) 允許從輸入流中讀取多個(gè)字符,可以指定輸入終止字符,讀取完成后,從讀取的內(nèi)容中刪除該終止字符. 輸入流的read函數(shù) 從一個(gè)文件讀字節(jié)到指定的存儲(chǔ)器區(qū)域,所讀字節(jié)數(shù)由長(zhǎng)度參數(shù)確定.若沒(méi)給長(zhǎng)度參數(shù),當(dāng)遇到文件結(jié)束時(shí)讀結(jié)束.,例1: 讀入一串字符到lin
18、e數(shù)組,以T終止 #include void main() char line100; cout“Type a line terminated by T” endl; cin.getline(line,sizeof(line),T); coutline; ,例2: 統(tǒng)計(jì)文件abc.dat中行數(shù)。 void main() ifstream fin(“d:abc.dat”); int count=0; char buffer100; while(!fin.eof() fin.getline(buffer,sizeof(buffer);備注: count+=1; coutcount; ,例3 從一個(gè)
19、payroll文件讀一個(gè)二進(jìn)制記錄到一個(gè)結(jié)構(gòu)中 #include #include void main( ) struct double salary; char name23; employee;,ifstream is (payroll,ios:binary |ios:nocreate); if(is) is.read(char*) ,輸出字符的成員函數(shù) ostream備注:int length 表示輸出字符的長(zhǎng)度;,void main() char letter; for(letter=97;letter97+26;letter+) cout.put(letter); ,inline v
20、oid putString(char *s) cout.put(t) cout.write(s,strlen(s) cout.put(n); int main() putString(“The first line”); putString(“The second line”); return 0; ,Output: The first line The second line,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,要使得插入運(yùn)算符“”能輸出用戶自定義類型,必須對(duì)其進(jìn)行重載。 定義輸出運(yùn)算符重載
21、函數(shù)的一般格式如下: ostream unsigned int jf; public: RMB(double v=0.0); RMB operator *(double d); friend ostream ,RMB RMB:operator *(double d) double td=(yuan+jf/100.)*d; return RMB(td); ostream ,例2:用輸出/入復(fù)數(shù),#include class complex float real,image; public: complex(float r, float i) real=r; image=i; complex()
22、real=0; image=0; friend complex operator+(complex,complex); friend ostream ,用輸出/入復(fù)數(shù),/定義重載運(yùn)算符+ complex operator +(complex a,complex b) complex temp; temp.real=a.real+b.real; temp.image=a.image+b.image; return temp; ,用輸出/入復(fù)數(shù),/定義重載運(yùn)算符0) output“+”; if(obj.image !=0) outputobj.imagei; return output; ,用輸出
23、/入復(fù)數(shù),/定義重載運(yùn)算符 istream ,用輸出/入復(fù)數(shù),/主函數(shù) main() complex c1(2.4, 4.6), c2, c3; coutc2; cout “The value of c2 is:”c2endl; c3=c1+c2; cout “The value of c3 is:”c3endl; return 0; ,用輸出/入復(fù)數(shù),/運(yùn)行結(jié)果: The value of c1 is:2.4+4.6i Input the real and image of a complex: 3.7 2.5 The value of c2 is:3.7+2.5i The value of
24、 c3 is:6.1+7.1i,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,class RMB friend ostream ,解決方法: 在派生類中重新定義插入運(yùn)算符的重載函數(shù)。 在重載插入運(yùn)算符時(shí),不直接進(jìn)行輸出,而是調(diào)用一個(gè)成員函數(shù)display()進(jìn)行輸出,并將display()定義為虛函數(shù),這樣重載插入運(yùn)算符的行為便隨display()的不同而不同。,class RMB protected: unsigned int yuan; unsigned int jf; public: RMB(do
25、uble v=0.0) RMB operator *(double d); virtual display(ostream,ostream ,class Derived: public RMB public: Derived(double v,int n):RMB(v),c(n) display(ostream,main() Derived a(5.5,3); cout a; ,class Currency protected: unsigned yuan; unsigned jf; public: Currency(double v=0.0) yuan=v; jf=(v-yuan)*100.
26、+0.5; virtual void display(ostream,class RMB:public Currency public: RMB(double v=0.0):Currency(v) virtual void display(ostream,class DM:public Currency public: DM(double v=0.0):Currency(v) virtual void display(ostream,ostream ,本章主要內(nèi)容,I/O流的概念 I/O標(biāo)準(zhǔn)流庫(kù) 文件流類 串流類 控制符 使用I/O成員函數(shù) 重載插入運(yùn)算符 插入運(yùn)算符與虛函數(shù) 文件操作,當(dāng)文件
27、是相關(guān)記錄的集合時(shí),可通過(guò)重載插入運(yùn)算符“”進(jìn)行文件的輸入、輸出操作。,文件輸出,實(shí)例:輸出三個(gè)學(xué)生對(duì)象的數(shù)據(jù)到一個(gè)文件(abc.dat)中,其中一個(gè)大學(xué)生,兩個(gè)碩士生。,Student.cpp Master.cpp Main.cpp Student.h Master.h,class Student protected: char pName20; unsigned int uID; double grade; public: Student(char* pS,unsigned int num, double g) strcpy(pName,pS); uID=num; grade=g; vir
28、tual void display(ostream,/ Student.h,#include Student.h #include #include void Student:display(ostream ,/ Student.cpp,#include class Master:public Student protected: char type; public: Master(char *pS=aa,unsigned num=0,double g=0.0,char t=C) :Student(pS,num,g),type(t) void display(ostream,/ Master.h,#include #include Student.h #include Muster.h void Master:display(ostream ,/ Master.cpp,#include #include Student.h #include Muster.h void main() ofstream fout(“c:abc.txt); Student s1(Dill Arnson,12567,3.5); Master s2(Welch Shamma
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 給水工程智能化升級(jí)方案
- 動(dòng)態(tài)調(diào)光照明控制系統(tǒng)方案
- 橋梁施工關(guān)鍵路徑分析
- 施工現(xiàn)場(chǎng)疫情防控方案
- 變形縫防水處理技術(shù)方案
- 磚砌體結(jié)構(gòu)耐久性分析
- 土方施工期間噪聲控制措施
- 保鮮庫(kù)可行性研究深度解析
- 英語(yǔ)時(shí)態(tài)辨析與情境應(yīng)用
- 工程施工管理制度與規(guī)程體系構(gòu)建
- 老年人高血壓的護(hù)理
- 糧油產(chǎn)品授權(quán)書
- 責(zé)任督學(xué)培訓(xùn)課件
- 關(guān)于安吉物流市場(chǎng)的調(diào)查報(bào)告
- 抑郁病診斷證明書
- 心電監(jiān)測(cè)技術(shù)操作考核評(píng)分標(biāo)準(zhǔn)
- 歷史時(shí)空觀念的教學(xué)與評(píng)價(jià)
- 維克多高中英語(yǔ)3500詞匯
- 《LED顯示屏基礎(chǔ)知識(shí)培訓(xùn)》
- 第五屆全國(guó)輔導(dǎo)員職業(yè)能力大賽案例分析與談心談話試題(附答案)
- LY/T 2501-2015野生動(dòng)物及其產(chǎn)品的物種鑒定規(guī)范
評(píng)論
0/150
提交評(píng)論