面向?qū)ο蠓治雠c設(shè)計chapter-2686課件_第1頁
面向?qū)ο蠓治雠c設(shè)計chapter-2686課件_第2頁
面向?qū)ο蠓治雠c設(shè)計chapter-2686課件_第3頁
面向?qū)ο蠓治雠c設(shè)計chapter-2686課件_第4頁
面向?qū)ο蠓治雠c設(shè)計chapter-2686課件_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、面向?qū)ο蠓治雠c設(shè)計chapter_2686課件面向?qū)ο蠓治雠c設(shè)計chapter_2686課件本章的教學(xué)內(nèi)容流的概念 文件輸入/輸出流類二進制模式的文件輸入/輸出校園信息管理系統(tǒng)中的數(shù)據(jù)輸入、輸出本章的教學(xué)內(nèi)容流的概念 6.1 流的概念在C+中,將從一個對象到另一個對象的數(shù)據(jù)流動抽象地表示為“流”或流對象。流動的方向不同,就產(chǎn)生不同的輸入/輸出流,即I/O流。在C+程序中,數(shù)據(jù)可以從鍵盤或磁盤文件流入到程序,形成輸入流,也可以從程序流向屏幕或磁盤文件,形成輸出流。在C+程序中,數(shù)據(jù)的輸入/輸出就是通過I/O流來實現(xiàn)的。一般地,每個流都是與某種設(shè)備相聯(lián)系的對象,與輸入設(shè)備(如鍵盤)相聯(lián)系的流稱為輸

2、入流;與輸出設(shè)備(如屏幕、打印機)相聯(lián)系的流稱為輸出流;與輸入/輸出設(shè)備(如磁盤)相聯(lián)系的流稱為輸入/輸出流。C+為每種輸入/輸出流定義了一個流類,用流類來描述這些流。C+的流類構(gòu)成一個流庫。6.1 流的概念在C+中,將從一個對象到另一個對象的數(shù)據(jù)流6.2 文件輸入/輸出流類C+中負責(zé)文件輸入/輸出的類主要有:ifstream文件輸入流類;ofstream文件輸出流類;fstream 文件輸入/輸出流類。要使用fstream類執(zhí)行文件的I/O時,必須定義一個fstream類的對象,然后使用該對象調(diào)用fstream類提供的成員函數(shù)open打開一個文件,open函數(shù)的參數(shù)有兩個,一個表示欲打開的磁

3、盤文件的名稱,另一個表示打開該文件的模式。例如: fstream file; file.open(“Myfile.txt”,ios:in);6.2 文件輸入/輸出流類C+中負責(zé)文件輸入/輸出的類主要面向?qū)ο蠓治雠c設(shè)計chapter_2686課件可用位或運算符 OR (|)運算符 將一些模式參數(shù)組合成一個模式參數(shù): file.open(“MyFile.txt”, ios:in|ios:out|ios:binary);可用位或運算符 OR (|)運算符 fstream類繼承了istream與ostream類中處理數(shù)據(jù)流輸入和輸出的成員函數(shù),因此可以實現(xiàn)文件的讀寫等操作。下表列出了fstream類中

4、的一些常用的文件處理函數(shù)。fstream類繼承了istream與ostream類中處理例6-1 文件的操作 #inlude #include using namespace std; void main() const int size=10; fstream file; /定義文件流類對象 char str_out=“string1”, str_insize; file.open(“Myfile.txt”,ios:out|ios:trunc); file.write(str_out,size); /將str_out寫入Myfile.txt file.close(); file.open(“M

5、yfile.txt”,ios:in); file.read(str_in,size); file.close(); cout“Reading data from filen”str_inend;例6-1 文件的操作6.3.3 二進制模式的文件I/O 在二進制模式下,可利用write函數(shù)將內(nèi)存中的數(shù)據(jù)以二進制串的形式直接輸出到文件里存儲,也可以用read從文件中以二進制串的形式讀入數(shù)據(jù)到內(nèi)存中。 #include #include #include /格式化輸入/出控制頭文件 using namespace std; void main() fstream file; char name48=“

6、Mary”,“John”, “Judy”,“Joe”; int id4=100,200,300,400; 6.3.3 二進制模式的文件I/Ofile.open(“List.txt”,ios:out|ios:binary|ios:trunc); /打開文件為二進制輸出模式if(!file) cerr“Cant open file!n”; exit(1); for (int i=0; i4; i+) file.write(char*)&idi,sizeof(int); file.write(char*)&namei,8*sizeof(char); file.close();char tname8;

7、int tid;file.open(“List.txt”,ios:in|ios:binary); /打開文件為二進制輸出模式if(!file) cerr“Cant open file!n”; exit(1); file.open(“List.txt”,ios:out|coutsetw(4)setiosflag(ios:right)“ID” setw(8) setiosflag(ios:right)“Name”endl;cout“-n”;file.read(char*)&tid, sizeof(int); /先讀取一筆數(shù)據(jù)file.read(tname, 8*sizeof(char);while

8、 (!file.eof() /循環(huán)讀取記錄,直到文件結(jié)尾 coutsetw(4)setioflags(ios:right)tid; setw(8) setioflags(ios:right)tnameendl; file.read(char*)&id,sizeof(int); file.read(tname,8*sizeof(char);file.close();coutsetw(4)setiosflag(ios:6.4 模板和標準模板庫6.4.1 模板的概念模板是對具有相同特性的類或函數(shù)的一般性 描述,一個模板并非一個實實在在的類或函數(shù),而是公式化或抽象化或參數(shù)化的類或函數(shù)。模板可以分為類模

9、板和函數(shù)模板。類模板是為一組數(shù)據(jù)屬性相似但某些數(shù)據(jù)類型不同的類抽象定義的一種公式化類或抽象類。在類模板中某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)或返回值類型可取任意類型。因此,類模板是數(shù)據(jù)類型抽象化或參數(shù)化的類。6.4 模板和標準模板庫6.4.1 模板的概念例8-2 已知兩個類A和B的定義,用類模板對這兩個類進行抽象定義。class A public: A(int y):x(y) private: int x; class B public: B(double y): x(y) private: double x; /用類模板實現(xiàn)template class C public: C(T y): x(y

10、) private: T x; C a; - A a;C b; - B b;例8-2 已知兩個類A和B的定義,用類模板對這兩個類進行抽象6.4.2 標準模板庫STLSTL 是Standard Template Library的縮寫,表示標準模板庫,它由許多模板組成。它能夠滿足軟件開發(fā)的實際需要,是一種強健和高效的C+程序庫。該庫包含了許多在計算機科學(xué)領(lǐng)域里常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法。為廣大C+程序員們提供了一個可擴展的應(yīng)用框架,高度體現(xiàn)了軟件的可重用性。 利用STL開發(fā)程序可以提高代碼的重用度,讓程序更加穩(wěn)定,便于維護,提高編寫程序的效率。6.4.2 標準模板庫STLSTL 是Standar

11、d TeSTL包含了一系列的容器類(containers),算法(algorithms)和迭代器(iterators)。例如,STL定義了容器類 list-線性表類模板,用這個類模板可定義一個線性表: list AllPerson; /用于存儲person類對象指針的線性表STL包含了一系列的容器類(containers),算法(a在線性表類中,還定義了迭代器類-iterator 類。 可用迭代器類來定義迭代器變量。迭代器變量有點像指針,算法通過迭代器變量來定位和操控容器中的元素。例如,下列語句定義了一個迭代器變量(或指針變量): list:iterator AllPersonIterator

12、; int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPserson.end(); +AllPersonIterator) sum+; 在線性表類中,還定義了迭代器類-iterator 類。6.5 校園信息管理系統(tǒng)中的數(shù)據(jù)存儲 通過前面的工作,我們的校園信息管理系統(tǒng)已經(jīng)能夠完成人員信息的輸入和顯示等一系列操作,但現(xiàn)在的程序并不能將信息長期保存,即程序關(guān)閉時數(shù)據(jù)會全部丟失。對于一個數(shù)據(jù)龐大的校園信息管理系統(tǒng)來說,不可能在每次程序運行時都重新輸入全部信息。所以,校園信息管理系統(tǒng)應(yīng)該實現(xiàn)數(shù)據(jù)的永久保存

13、功能。 要想長期保存對象數(shù)據(jù),必須在程序運行結(jié)束時將對象中的數(shù)據(jù)全部寫入磁盤文件,以后程序運行時又可以讀出這些數(shù)據(jù)。這樣可以實現(xiàn)數(shù)據(jù)的永久保存。6.5 校園信息管理系統(tǒng)中的數(shù)據(jù)存儲 通過前在設(shè)計person,student和teacher類時,已聲明了如下函數(shù),但尚未定義: void Save(ofstream* ofile);-將對象數(shù)據(jù)寫出到文件中。 void Load(ifstream* ifile); -從文件中讀入數(shù)據(jù)。 要存儲對象就是要將每個成員變量的值都存入文件中,比如以字符串形式存入文件。 class person public: char name10; char sex10

14、; char address100; date birthday; ptype type; virtual void Save(ofstream* ofile); virtual void Load(ifstream* ifile); ;在設(shè)計person,student和teacher類時,已聲void person:Save(ofstream* ofile) ofile-write(char*)&type,sizeof(type);int len=0;len=strlen(name);ofile-write(char*)&len, sizeof(int);ofile-write(name,

15、len); len=strlen(sex);ofile-write(char*)&len, sizeof(int);ofile-write(sex,len); len=strlen(address);ofile-write(char*)&len, sizeof(int);ofile-write(address, len); ofile-write(char*)&birthday, sizeof(date);void person:Save(ofstream* ofvoid person:Load(ifstream* ifile)/將文件的信息讀出int len=0;ifile-read(cha

16、r*)&len, sizeof(int);ifile-read(name,len); namelen=0;ifile-read(char*)&len, sizeof(int);ifile-read(sex, len); sexlen=0; ifile-read(char*)&len, sizeof(int);ifile-read(address, len); addresslen=0;ifile-read(char*)&birthday, sizeof(date);void person:Load(ifstream* ifvoid student:Save(ofstream* ofile)pe

17、rson:Save(ofile); /先調(diào)用基類Save函數(shù)int len=0;len=strlen(sclass);ofile-write(char*)&len, sizeof(int);ofile-write(sclass, len); len=strlen(major);ofile-write(char*)&len, sizeof(int);ofile-write(major, len); ofile-write(char*)&sregister, sizeof(date);void student:Save(ofstream* ovoid student:Load(ifstream*

18、ifile) / 讀入數(shù)據(jù)person:Load(ifile); /先調(diào)用基類Save函數(shù)int len=0;ifile-read(char*)&len, sizeof(int);ifile-read(sclass, len); sclasslen=0;ifile-read(char*)&len, sizeof(int);ifile-read(major, len); majorlen=0;ifile-read(char*)&sregister,sizeof(date);void student:Load(ifstream* ivoid teacher:Save(ofstream* ofile

19、) /寫入文件person:Save(ofile);/先調(diào)用基類Save函數(shù) ofile-write(char*)&tregister, sizeof(date);void teacher:Load(ifstream* ifile)/ 讀入數(shù)據(jù) person:Load(ifile); /先調(diào)用基類Save函數(shù) ifile-read(char*)&tregister, sizeof(date);void teacher:Save(ofstream* ovoid main() char cmd64;cout歡迎進入校園信息管理系統(tǒng)v1.0endl;cout請選擇你要進行的操作:endl;do co

20、ut; cincmd;if (strcmp(cmd,exit)=0) if( exitCMD() ) break; else if ( strcmp(cmd,help)=0 | strcmp(cmd,?)=0) helpCMD(); else if ( strcmp(cmd,input)=0 ) inputCMD(); else if ( strcmp(cmd,output)=0 ) outputCMD(); else if ( strcmp(cmd,analyze)=0 ) analyzeCMD(); else if ( strcmp(cmd,save)=0 ) saveCMD(); els

21、e if ( strcmp(cmd,load)=0 ) loadCMD(); else cout錯誤:無指定命令,輸入help查看幫助!endl;while(true); void main()#include /引用類庫list,通過std調(diào)用using namespace std;list AllPerson; /定義線性表對象void inputCMD() /輸入數(shù)據(jù) coutA輸入學(xué)生信息endl; coutB輸入教師信息bInfo;if (bInfo=a| bInfo=A) student* s=new student(); /創(chuàng)建學(xué)生對象 s-Read(); /輸入學(xué)生數(shù)據(jù) All

22、Person.push_back(person*)s); /將對象實例存入順序表 cout成功輸入學(xué)生信息endl; #include /引用類庫list,通過else if (bInfo=b |bInfo=B) teacher* t=new teacher(); /創(chuàng)建教師對象 t-Read(); /輸入學(xué)生數(shù)據(jù) AllPerson.push_back(person*)t); /將對象實例存入順序表 cout成功輸入教師信息endl; else cout輸入失敗!請選擇輸入學(xué)生或教師信息endl; else if (bInfo=b |bInfo=void outputCMD() /輸出數(shù)據(jù)l

23、ist :iterator AllPersonIterator;int i=0;for(AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) i+; cout-NO.i-Show(); /調(diào)用鏈表顯示輸入的數(shù)據(jù) void outputCMD() /輸出數(shù)據(jù)void analyzeCMD() /統(tǒng)計分析數(shù)據(jù) list :iterator AllPersonIterator;int sum=0, nstu=0, ntea=0; /初始化計數(shù)for (AllPerson

24、Iterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) if (*AllPersonIterator)-type=STUDENT) nstu+; /如果是學(xué)生,學(xué)生人數(shù)加1if (*AllPersonIterator)-type=TEACHER) ntea+;/如果是教師,教師人數(shù)加1 sum+;/總?cè)藬?shù)加1cout當(dāng)前總?cè)藬?shù)為:sumendl;cout其中教師共:ntea人,“ 學(xué)生共:nstu人,endl;void analyzeCMD() void saveCMD() /將數(shù)據(jù)

25、存入文件 ofstream ofile(person.dat, ios: binary|ios:trunc); list :iterator AllPersonIterator;int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) sum+;ofile.write(char*)&sum,5);void saveCMD() /將數(shù)據(jù)存入文件for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) (*AllPersonIterator)-Save(&ofile); ofile.close();cout成功保存sum人信息endl; for (AllPersonIterator=AllPersvoid loadCMD() /將數(shù)據(jù)從文件讀出ifstream ifile(person.dat);list :iterator AllPersonIterator;int sum=0;ifile.read(char*)&sum,4); for (int i=0; iLoad(&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論