




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第十九章 I/O流,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,有關輸入、輸出操作并沒有在C+語言中定義,但它包含在C+的實現中,并作為C+的一個標準庫 iostream類庫提供。,為什么要有C+流類庫,非類型安全問題,#include int j=10; float f=6.98; main() printf(%d,f); scanf(%d, ,為什么要有C+流類庫,C語言的輸入輸出系統(tǒng)不支持用戶自定義的對象或數據類型,如一定義: struct sample int i ; float f; cha
2、r *ch; s1; 不能用輸出函數來輸出以上結構變量: printf(“%sample”,s1);,C+中,用戶自定義的對象很多。C+的類機制允許它可以建立一個可控制的輸入輸出系統(tǒng)。可以通過重載“”運算符來解決以上的問題。,流類庫和流,流 C+的I/O是以字節(jié)流的形式實現的,流實際上就是一個字節(jié)序列。 每個流都和一種與設備相聯系。 與輸入設備(如鍵盤)聯系的流為輸入流;與輸出設備(如屏幕)聯系的流為輸出流。,流類庫和流,C+的iostream類庫是提供一組類,程序利用它們可以方便的與外部世界交換數據. C+的iostream類庫是用繼承的方法建立起來的一個輸入輸出類庫。 iostream類庫
3、有兩個基類,即streambuf類和ios類。 streambuf類提供對緩沖區(qū)的低級操作,如緩沖區(qū)的設置、緩沖區(qū)的讀寫等。 ios類用來完成檢查錯誤的格式化輸入、輸出。,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,C+語言為實現數據的輸入輸出定義了許多復雜的類,這些類都以ios為基類,其余都是它的直接或間接派生類。這些類以及它們之間的關系如圖所示。,ios istream istrstream istream_withassign ifstream ostream ostrstream ostrea
4、m_withassign ofstream,iostream fstream strstream stdiostream,每種類標識符代表的含義如下: 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+中定義了四個標準流對象 cin 一個istream類的對象,用于處理標準輸入 cout 一個ostream類的對象,用于處理標準輸出 cerr 一個ostream類的對象,用于處理標準錯誤輸出,沒有緩沖,發(fā)給它的內容立即輸出。 clog 類似于cerr,但有緩沖,緩沖區(qū)滿時被輸出.,在類ostream中,對“”運算符進行了重載: ostream,在缺省情況下,標準輸出設備是顯
6、示終端,標準輸入設備是鍵盤。 在任何情況下,標準錯誤輸出設備總是顯示終端。 標準輸出設備可以不是顯示終端;但錯誤信息總是在顯示屏幕上顯示。,#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);,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,文件,C+把文件看成是由數據序列組成的。 根據數據的組織形式,文件可以分為文本文件和二進
7、制文件。 文本文件也稱ASCII文件,每個字節(jié)存放一個ASCII字符。 二進制文件是將數據按在內存中的存儲形式存放到磁盤上。 一般二進制文件占用的空間比較少。 如:整數100000只要4個字節(jié)。,C+中與文件處理相關的三個類: 類 ifstream 執(zhí)行文件的輸入操作 類 ofstream 執(zhí)行文件的輸出操作 類 fstream 執(zhí)行文件的輸入/輸出操作,在C+中,要進行文件的輸入輸出操作,應該: 先創(chuàng)建一個流對象 ofstream( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot ); 進行文件的讀寫
8、操作 關閉文件,文件打開方式: ios:ate:到輸入或輸出文件的文件尾 ios:in: 打開輸入文件(ifstream 默認) ios:out: 打開輸出文件(ofstream 默認) ios:nocreate :如果文件不存在,返回錯誤ios:noreplace : 如果文件已存在,返回錯誤 ios:trunc : 如文件存在,清除文件內容 ios:binary : 以二進制模式打開文件,文件保護方式選擇項 標志 含義 filebuf:openprot 兼容共享方式 filebuf:sh_none 獨占,不共享 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; ,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用
10、I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,I/O流庫提供了用字符數組輸入輸出信息的操作。 ostrstream 用于將信息輸出至字符數組 istrstream 用于從字符數組輸入信息 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; ,本章主要內容,I/O流的概念 I/O標準流庫
12、 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,C+中提供了兩種進行格式控制的方法: 用ios類成員函數進行格式化 用控制符進行格式化控制,用ios類成員函數進行格式化,設置域寬函數 width(int wid) 設置精度函數 precision(int p) 設置填充字符函數 fill(char c),用控制符進行格式化控制,控制符是以一個流引用作為參數,并返回同一流的引用,因此它可以直接嵌入到插入流中。 C+中提供了一些標準控制符和標準控制符函數。,示例: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; ,程序運行結果: 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 ,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,常見流對象的成員函數有: precision
15、( ) 設置顯示小數精度,用于cout width( ) 設置域寬,用于cout flags( ) 設置基數和填充字符,用于cout get( ) 讀取一個字符,用于cin getline( ) 讀取一行字符,用于cin read( ) 讀取一個字符串,用于cin put( ) 輸出一個字符,用于cout write( ) 輸出一個字符串,用于cout,輸入流的get()函數 功能: 與“”相像.但get函數在讀入數據時包括空白字符,而“”在缺省時拒絕接受. 形式: 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函數 允許從輸入流中讀取多個字符,可以指定輸入終止字符,讀取完成后,從讀取的內容中刪除該終止字符. 輸入流的read函數 從一個文件讀字節(jié)到指定的存儲器區(qū)域,所讀字節(jié)數由長度參數確定.若沒給長度參數,當遇到文件結束時讀結束.,例1: 讀入一串字符到lin
18、e數組,以T終止 #include void main() char line100; cout“Type a line terminated by T” endl; cin.getline(line,sizeof(line),T); coutline; ,例2: 統(tǒng)計文件abc.dat中行數。 void main() ifstream fin(“d:abc.dat”); int count=0; char buffer100; while(!fin.eof() fin.getline(buffer,sizeof(buffer);備注: count+=1; coutcount; ,例3 從一個
19、payroll文件讀一個二進制記錄到一個結構中 #include #include void main( ) struct double salary; char name23; employee;,ifstream is (payroll,ios:binary |ios:nocreate); if(is) is.read(char*) ,輸出字符的成員函數 ostream備注:int length 表示輸出字符的長度;,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,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,要使得插入運算符“”能輸出用戶自定義類型,必須對其進行重載。 定義輸出運算符重載
21、函數的一般格式如下: 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:用輸出/入復數,#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 ,用輸出/入復數,/定義重載運算符+ complex operator +(complex a,complex b) complex temp; temp.real=a.real+b.real; temp.image=a.image+b.image; return temp; ,用輸出/入復數,/定義重載運算符0) output“+”; if(obj.image !=0) outputobj.imagei; return output; ,用輸出
23、/入復數,/定義重載運算符 istream ,用輸出/入復數,/主函數 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; ,用輸出/入復數,/運行結果: 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,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,class RMB friend ostream ,解決方法: 在派生類中重新定義插入運算符的重載函數。 在重載插入運算符時,不直接進行輸出,而是調用一個成員函數display()進行輸出,并將display()定義為虛函數,這樣重載插入運算符的行為便隨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 ,本章主要內容,I/O流的概念 I/O標準流庫 文件流類 串流類 控制符 使用I/O成員函數 重載插入運算符 插入運算符與虛函數 文件操作,當文件
27、是相關記錄的集合時,可通過重載插入運算符“”進行文件的輸入、輸出操作。,文件輸出,實例:輸出三個學生對象的數據到一個文件(abc.dat)中,其中一個大學生,兩個碩士生。,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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學生在線學習平臺
- 江蘇省安全文明施工措施費
- 項目進度匯報及協調通知
- 跨部門協作會議紀要與行動計劃
- 高效會議管理技巧與實踐指南
- 臺風應急預案演練方案
- 項目預算控制表模板(財務部門)
- 可持續(xù)發(fā)展戰(zhàn)略實踐分享
- 電子交易系統(tǒng)操作指南
- 辦公室職員健康促進措施
- 小學生防溺水安全教育主題班會ppt市公開課一等獎省名師優(yōu)質課賽課一等獎課件
- 中國近代海關史課件
- 《人衛(wèi)版第九版內科學心力衰竭》課件PPT
- 中藥熱鹽包熱熨講稿
- 目視檢測VT報告
- 四川省中小流域暴雨洪水計算
- 水泥熟料巖相分析
- 雜詩十二首其二陶淵明
- 第五屆大廣賽獲獎作品
- 《廣告攝影》課件第五講 食品廣告拍攝與后期制作
- (三起點)pep人教版五年級英語下學期Unit2單元課件全套
評論
0/150
提交評論