




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、面向?qū)ο蠓治雠c設(shè)計(jì)chapter_2686課件面向?qū)ο蠓治雠c設(shè)計(jì)chapter_2686課件本章的教學(xué)內(nèi)容流的概念 文件輸入/輸出流類二進(jìn)制模式的文件輸入/輸出校園信息管理系統(tǒng)中的數(shù)據(jù)輸入、輸出本章的教學(xué)內(nèi)容流的概念 6.1 流的概念在C+中,將從一個(gè)對(duì)象到另一個(gè)對(duì)象的數(shù)據(jù)流動(dòng)抽象地表示為“流”或流對(duì)象。流動(dòng)的方向不同,就產(chǎn)生不同的輸入/輸出流,即I/O流。在C+程序中,數(shù)據(jù)可以從鍵盤(pán)或磁盤(pán)文件流入到程序,形成輸入流,也可以從程序流向屏幕或磁盤(pán)文件,形成輸出流。在C+程序中,數(shù)據(jù)的輸入/輸出就是通過(guò)I/O流來(lái)實(shí)現(xiàn)的。一般地,每個(gè)流都是與某種設(shè)備相聯(lián)系的對(duì)象,與輸入設(shè)備(如鍵盤(pán))相聯(lián)系的流稱為輸
2、入流;與輸出設(shè)備(如屏幕、打印機(jī))相聯(lián)系的流稱為輸出流;與輸入/輸出設(shè)備(如磁盤(pán))相聯(lián)系的流稱為輸入/輸出流。C+為每種輸入/輸出流定義了一個(gè)流類,用流類來(lái)描述這些流。C+的流類構(gòu)成一個(gè)流庫(kù)。6.1 流的概念在C+中,將從一個(gè)對(duì)象到另一個(gè)對(duì)象的數(shù)據(jù)流6.2 文件輸入/輸出流類C+中負(fù)責(zé)文件輸入/輸出的類主要有:ifstream文件輸入流類;ofstream文件輸出流類;fstream 文件輸入/輸出流類。要使用fstream類執(zhí)行文件的I/O時(shí),必須定義一個(gè)fstream類的對(duì)象,然后使用該對(duì)象調(diào)用fstream類提供的成員函數(shù)open打開(kāi)一個(gè)文件,open函數(shù)的參數(shù)有兩個(gè),一個(gè)表示欲打開(kāi)的磁
3、盤(pán)文件的名稱,另一個(gè)表示打開(kāi)該文件的模式。例如: fstream file; file.open(“Myfile.txt”,ios:in);6.2 文件輸入/輸出流類C+中負(fù)責(zé)文件輸入/輸出的類主要面向?qū)ο蠓治雠c設(shè)計(jì)chapter_2686課件可用位或運(yùn)算符 OR (|)運(yùn)算符 將一些模式參數(shù)組合成一個(gè)模式參數(shù): file.open(“MyFile.txt”, ios:in|ios:out|ios:binary);可用位或運(yùn)算符 OR (|)運(yùn)算符 fstream類繼承了istream與ostream類中處理數(shù)據(jù)流輸入和輸出的成員函數(shù),因此可以實(shí)現(xiàn)文件的讀寫(xiě)等操作。下表列出了fstream類中
4、的一些常用的文件處理函數(shù)。fstream類繼承了istream與ostream類中處理例6-1 文件的操作 #inlude #include using namespace std; void main() const int size=10; fstream file; /定義文件流類對(duì)象 char str_out=“string1”, str_insize; file.open(“Myfile.txt”,ios:out|ios:trunc); file.write(str_out,size); /將str_out寫(xiě)入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 二進(jìn)制模式的文件I/O 在二進(jìn)制模式下,可利用write函數(shù)將內(nèi)存中的數(shù)據(jù)以二進(jìn)制串的形式直接輸出到文件里存儲(chǔ),也可以用read從文件中以二進(jìn)制串的形式讀入數(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 二進(jìn)制模式的文件I/Ofile.open(“List.txt”,ios:out|ios:binary|ios:trunc); /打開(kāi)文件為二進(jìn)制輸出模式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); /打開(kāi)文件為二進(jìn)制輸出模式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 模板和標(biāo)準(zhǔn)模板庫(kù)6.4.1 模板的概念模板是對(duì)具有相同特性的類或函數(shù)的一般性 描述,一個(gè)模板并非一個(gè)實(shí)實(shí)在在的類或函數(shù),而是公式化或抽象化或參數(shù)化的類或函數(shù)。模板可以分為類模
9、板和函數(shù)模板。類模板是為一組數(shù)據(jù)屬性相似但某些數(shù)據(jù)類型不同的類抽象定義的一種公式化類或抽象類。在類模板中某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)或返回值類型可取任意類型。因此,類模板是數(shù)據(jù)類型抽象化或參數(shù)化的類。6.4 模板和標(biāo)準(zhǔn)模板庫(kù)6.4.1 模板的概念例8-2 已知兩個(gè)類A和B的定義,用類模板對(duì)這兩個(gè)類進(jìn)行抽象定義。class A public: A(int y):x(y) private: int x; class B public: B(double y): x(y) private: double x; /用類模板實(shí)現(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 已知兩個(gè)類A和B的定義,用類模板對(duì)這兩個(gè)類進(jìn)行抽象6.4.2 標(biāo)準(zhǔn)模板庫(kù)STLSTL 是Standard Template Library的縮寫(xiě),表示標(biāo)準(zhǔn)模板庫(kù),它由許多模板組成。它能夠滿足軟件開(kāi)發(fā)的實(shí)際需要,是一種強(qiáng)健和高效的C+程序庫(kù)。該庫(kù)包含了許多在計(jì)算機(jī)科學(xué)領(lǐng)域里常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法。為廣大C+程序員們提供了一個(gè)可擴(kuò)展的應(yīng)用框架,高度體現(xiàn)了軟件的可重用性。 利用STL開(kāi)發(fā)程序可以提高代碼的重用度,讓程序更加穩(wěn)定,便于維護(hù),提高編寫(xiě)程序的效率。6.4.2 標(biāo)準(zhǔn)模板庫(kù)STLSTL 是Standar
11、d TeSTL包含了一系列的容器類(containers),算法(algorithms)和迭代器(iterators)。例如,STL定義了容器類 list-線性表類模板,用這個(gè)類模板可定義一個(gè)線性表: list AllPerson; /用于存儲(chǔ)person類對(duì)象指針的線性表STL包含了一系列的容器類(containers),算法(a在線性表類中,還定義了迭代器類-iterator 類。 可用迭代器類來(lái)定義迭代器變量。迭代器變量有點(diǎn)像指針,算法通過(guò)迭代器變量來(lái)定位和操控容器中的元素。例如,下列語(yǔ)句定義了一個(gè)迭代器變量(或指針變量): list:iterator AllPersonIterator
12、; int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPserson.end(); +AllPersonIterator) sum+; 在線性表類中,還定義了迭代器類-iterator 類。6.5 校園信息管理系統(tǒng)中的數(shù)據(jù)存儲(chǔ) 通過(guò)前面的工作,我們的校園信息管理系統(tǒng)已經(jīng)能夠完成人員信息的輸入和顯示等一系列操作,但現(xiàn)在的程序并不能將信息長(zhǎng)期保存,即程序關(guān)閉時(shí)數(shù)據(jù)會(huì)全部丟失。對(duì)于一個(gè)數(shù)據(jù)龐大的校園信息管理系統(tǒng)來(lái)說(shuō),不可能在每次程序運(yùn)行時(shí)都重新輸入全部信息。所以,校園信息管理系統(tǒng)應(yīng)該實(shí)現(xiàn)數(shù)據(jù)的永久保存
13、功能。 要想長(zhǎng)期保存對(duì)象數(shù)據(jù),必須在程序運(yùn)行結(jié)束時(shí)將對(duì)象中的數(shù)據(jù)全部寫(xiě)入磁盤(pán)文件,以后程序運(yùn)行時(shí)又可以讀出這些數(shù)據(jù)。這樣可以實(shí)現(xiàn)數(shù)據(jù)的永久保存。6.5 校園信息管理系統(tǒng)中的數(shù)據(jù)存儲(chǔ) 通過(guò)前在設(shè)計(jì)person,student和teacher類時(shí),已聲明了如下函數(shù),但尚未定義: void Save(ofstream* ofile);-將對(duì)象數(shù)據(jù)寫(xiě)出到文件中。 void Load(ifstream* ifile); -從文件中讀入數(shù)據(jù)。 要存儲(chǔ)對(duì)象就是要將每個(gè)成員變量的值都存入文件中,比如以字符串形式存入文件。 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è)計(jì)person,student和teacher類時(shí),已聲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、) /寫(xiě)入文件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歡迎進(jìn)入校園信息管理系統(tǒng)v1.0endl;cout請(qǐng)選擇你要進(jìn)行的操作: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錯(cuò)誤:無(wú)指定命令,輸入help查看幫助!endl;while(true); void main()#include /引用類庫(kù)list,通過(guò)std調(diào)用using namespace std;list AllPerson; /定義線性表對(duì)象void inputCMD() /輸入數(shù)據(jù) coutA輸入學(xué)生信息endl; coutB輸入教師信息bInfo;if (bInfo=a| bInfo=A) student* s=new student(); /創(chuàng)建學(xué)生對(duì)象 s-Read(); /輸入學(xué)生數(shù)據(jù) All
22、Person.push_back(person*)s); /將對(duì)象實(shí)例存入順序表 cout成功輸入學(xué)生信息endl; #include /引用類庫(kù)list,通過(guò)else if (bInfo=b |bInfo=B) teacher* t=new teacher(); /創(chuàng)建教師對(duì)象 t-Read(); /輸入學(xué)生數(shù)據(jù) AllPerson.push_back(person*)t); /將對(duì)象實(shí)例存入順序表 cout成功輸入教師信息endl; else cout輸入失?。≌?qǐng)選擇輸入學(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)計(jì)分析數(shù)據(jù) list :iterator AllPersonIterator;int sum=0, nstu=0, ntea=0; /初始化計(jì)數(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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育行業(yè)假期旅游證明(6篇)
- 現(xiàn)代汽車(chē)技術(shù)與維修實(shí)踐題集
- 水利水電工程考試全景預(yù)測(cè)與試題及答案
- 社會(huì)化媒體與公共關(guān)系的融合試題及答案
- 經(jīng)濟(jì)法概論新穎試題及答案分享
- 2025年市政工程職業(yè)規(guī)劃與試題答案
- 行政管理與公關(guān)理論的結(jié)合試題及答案
- 美術(shù)課件簡(jiǎn)筆畫(huà)
- 2025年工程項(xiàng)目管理復(fù)習(xí)的竅門(mén)及試題及答案
- 工程項(xiàng)目管理過(guò)程創(chuàng)新試題及答案
- 建設(shè)項(xiàng)目全過(guò)程工程咨詢-終結(jié)性考試-國(guó)開(kāi)(SC)-參考資料
- 小紅書(shū)種草營(yíng)銷(xiāo)師(初級(jí))認(rèn)證考試真題試題庫(kù)(含答案)
- GB/T 4942-2021旋轉(zhuǎn)電機(jī)整體結(jié)構(gòu)的防護(hù)等級(jí)(IP代碼)分級(jí)
- GB/T 19876-2012機(jī)械安全與人體部位接近速度相關(guān)的安全防護(hù)裝置的定位
- 礦山安全生產(chǎn)責(zé)任制匯編
- 房屋外立面改造施工組織設(shè)計(jì)方案
- 小學(xué)四年級(jí)道德與法治下冊(cè)9《生活離不開(kāi)他們》課件
- 實(shí)驗(yàn)室安全記錄表
- 商品房交房驗(yàn)收項(xiàng)目表格
- 淺析幼兒攻擊性行為產(chǎn)生的原因及對(duì)策
- 以“政府績(jī)效與公眾信任”為主題撰寫(xiě)一篇小論文6篇
評(píng)論
0/150
提交評(píng)論