面向?qū)ο蟮脑O(shè)計(jì)與分析課件chapter6_第1頁
面向?qū)ο蟮脑O(shè)計(jì)與分析課件chapter6_第2頁
面向?qū)ο蟮脑O(shè)計(jì)與分析課件chapter6_第3頁
面向?qū)ο蟮脑O(shè)計(jì)與分析課件chapter6_第4頁
面向?qū)ο蟮脑O(shè)計(jì)與分析課件chapter6_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第6章章 文件的輸入與輸出文件的輸入與輸出n本章的教學(xué)目的本章的教學(xué)目的 內(nèi)存中的數(shù)據(jù)只能暫時(shí)存儲(chǔ),關(guān)機(jī)后會(huì)自然消失。內(nèi)存中的數(shù)據(jù)只能暫時(shí)存儲(chǔ),關(guān)機(jī)后會(huì)自然消失。因此,要把數(shù)據(jù)永久地保留下來以備以后使用,唯一因此,要把數(shù)據(jù)永久地保留下來以備以后使用,唯一的辦法就是將數(shù)據(jù)輸出到文件里,以后要用數(shù)據(jù)時(shí)便的辦法就是將數(shù)據(jù)輸出到文件里,以后要用數(shù)據(jù)時(shí)便可從文件中讀出??蓮奈募凶x出。 C+C+編譯系統(tǒng)提供了一組編譯系統(tǒng)提供了一組實(shí)現(xiàn)文件輸入實(shí)現(xiàn)文件輸入/ /輸出的輸出的類類, ,那就是那就是I/OI/O流類庫流類庫, ,又稱又稱I/OI/O流庫。應(yīng)用流庫。應(yīng)用I/OI/O流庫,不僅流庫,不僅能夠處理

2、基本類型數(shù)據(jù)的輸入能夠處理基本類型數(shù)據(jù)的輸入/ /輸出,還能處理用戶輸出,還能處理用戶自定義類型數(shù)據(jù)的輸入自定義類型數(shù)據(jù)的輸入/ /輸出。因此,我們應(yīng)該學(xué)習(xí)輸出。因此,我們應(yīng)該學(xué)習(xí)用用C+C+的的I/OI/O流類實(shí)現(xiàn)的文件輸入與輸出方法。流類實(shí)現(xiàn)的文件輸入與輸出方法。n本章的教學(xué)內(nèi)容本章的教學(xué)內(nèi)容l流的概念流的概念 l文件輸入文件輸入/輸出流類輸出流類l二進(jìn)制模式的文件輸入二進(jìn)制模式的文件輸入/輸出輸出l校園信息管理系統(tǒng)中的數(shù)據(jù)輸入、輸出校園信息管理系統(tǒng)中的數(shù)據(jù)輸入、輸出6.1 流的概念流的概念在在C+C+中,將從一個(gè)對(duì)象到另一個(gè)對(duì)象的數(shù)據(jù)流動(dòng)抽中,將從一個(gè)對(duì)象到另一個(gè)對(duì)象的數(shù)據(jù)流動(dòng)抽象地表示

3、為象地表示為“流流”或或流對(duì)象流對(duì)象。在程序中,在程序中,“流流”具體體現(xiàn)為一個(gè)對(duì)象,負(fù)責(zé)在數(shù)據(jù)生產(chǎn)者和數(shù)具體體現(xiàn)為一個(gè)對(duì)象,負(fù)責(zé)在數(shù)據(jù)生產(chǎn)者和數(shù)據(jù)消費(fèi)者之間建立聯(lián)系,控制數(shù)據(jù)的流動(dòng)。例據(jù)消費(fèi)者之間建立聯(lián)系,控制數(shù)據(jù)的流動(dòng)。例如如cin、cout就是兩個(gè)流對(duì)象。就是兩個(gè)流對(duì)象。流動(dòng)的方向不同,流動(dòng)的方向不同,就產(chǎn)生不同的輸入就產(chǎn)生不同的輸入/ /輸出流,即輸出流,即I/OI/O流流。利用利用I/O流既可進(jìn)行有格式輸入流既可進(jìn)行有格式輸入/輸出,也可輸出,也可進(jìn)行無格式輸入進(jìn)行無格式輸入/輸出。輸出。為了實(shí)現(xiàn)格式化的輸出,為了實(shí)現(xiàn)格式化的輸出,I/O流類庫提供了豐流類庫提供了豐富的流操縱符,比如

4、設(shè)置輸出域的寬度,設(shè)置富的流操縱符,比如設(shè)置輸出域的寬度,設(shè)置輸出精度,設(shè)置填充字符等。輸出精度,設(shè)置填充字符等。n在在C+C+程序中,數(shù)據(jù)可以從鍵盤或磁盤文件流程序中,數(shù)據(jù)可以從鍵盤或磁盤文件流入到程序,形成入到程序,形成輸入流輸入流,也可以從程序流向屏,也可以從程序流向屏幕或磁盤文件,形成幕或磁盤文件,形成輸出流輸出流。在。在C+C+程序中,程序中,數(shù)據(jù)的輸入數(shù)據(jù)的輸入/ /輸出就是通過輸出就是通過I/OI/O流來實(shí)現(xiàn)的。流來實(shí)現(xiàn)的。n一般地,一般地,每個(gè)每個(gè)流流都都是是與某種設(shè)備相聯(lián)系的與某種設(shè)備相聯(lián)系的對(duì)象對(duì)象,與輸入設(shè)備(如鍵盤)相聯(lián)系的流稱為輸入流;與輸入設(shè)備(如鍵盤)相聯(lián)系的流稱

5、為輸入流;與輸出設(shè)備(如屏幕、打印機(jī))相聯(lián)系的流稱與輸出設(shè)備(如屏幕、打印機(jī))相聯(lián)系的流稱為輸出流;與輸入為輸出流;與輸入/ /輸出設(shè)備(如磁盤)相聯(lián)輸出設(shè)備(如磁盤)相聯(lián)系的流稱為輸入系的流稱為輸入/ /輸出流輸出流。nC+為每種為每種輸入輸入/ /輸出流定義了一個(gè)流類,用輸出流定義了一個(gè)流類,用流類來描述這些流。流類來描述這些流。C+C+的流類構(gòu)成一個(gè)流庫。的流類構(gòu)成一個(gè)流庫。流類庫C+C+編譯系統(tǒng)提供了用于輸入輸出的編譯系統(tǒng)提供了用于輸入輸出的iostreamiostream類庫。類庫。iostreamiostream這個(gè)單詞是由個(gè)部分組成的這個(gè)單詞是由個(gè)部分組成的, ,即即i-o-st

6、reami-o-stream, ,意意為輸入輸出流。在為輸入輸出流。在iostreamiostream類庫中包含許多用于輸入輸類庫中包含許多用于輸入輸出的類。出的類。iosios是抽象基類是抽象基類, ,由它派生出由它派生出istreamistream類和類和ostreamostream類類, ,兩個(gè)類名中第個(gè)字母兩個(gè)類名中第個(gè)字母i i和和o o分別代表輸入分別代表輸入(input)(input)和輸出和輸出(output)(output)。istreamistream類支持輸入操類支持輸入操作作, ,ostreamostream類支持輸出操作類支持輸出操作, ,iostreamiostre

7、am類支持輸入輸出類支持輸入輸出操作。操作。iostreamiostream類是從類是從istreamistream類和類和ostreamostream類通過多重類通過多重繼承而派生的類。常用的見繼承而派生的類。常用的見c+c+程序設(shè)計(jì)語言相關(guān)參考程序設(shè)計(jì)語言相關(guān)參考書。書。C+C+對(duì)文件的輸入輸出需要用對(duì)文件的輸入輸出需要用ifstreamifstream和和ofstreamofstream類類, ,兩兩個(gè)類名中第個(gè)字母?jìng)€(gè)類名中第個(gè)字母i i和和o o分別代表輸入和輸出分別代表輸入和輸出, ,第個(gè)字母第個(gè)字母f f代表文件代表文件(file)(file)。ifstreamifstream支持

8、對(duì)文件的輸入操支持對(duì)文件的輸入操作作, ,ofstreamofstream支持對(duì)文件的輸出操作。類支持對(duì)文件的輸出操作。類ifstreamifstream繼承繼承了類了類istreamistream, ,類類ofstreamofstream繼承了類繼承了類ostreamostream, ,類類fstreamfstream繼承了類繼承了類iostreamiostream。I/O流庫的類體系basic_iosbasic_istreambasic_ostreambasic_ifstreambasic_iostreambasic_ofstreambasic_fstream流類庫的頭文件iostream

9、iostream類庫中不同的類的聲明被放在類庫中不同的類的聲明被放在不同的頭文件中不同的頭文件中, ,用戶在自己的程序中用用戶在自己的程序中用#include#include命令包含了有關(guān)的頭文件就相命令包含了有關(guān)的頭文件就相當(dāng)于在本程序中聲明了所需要用到的類。當(dāng)于在本程序中聲明了所需要用到的類??梢該Q一種說法可以換一種說法: : 頭文件是程序與類庫頭文件是程序與類庫的接口的接口, ,iostreamiostream類庫的接口分別由不同類庫的接口分別由不同的頭文件來實(shí)現(xiàn)。的頭文件來實(shí)現(xiàn)。流類庫的頭文件:包括包括istreamistream、ostreamostream、iostreamiost

10、ream以及以及cincin、coutcout、ceerceer和和clogclog對(duì)象的定義,同時(shí)提供非格式化和格式化對(duì)象的定義,同時(shí)提供非格式化和格式化的的I/OI/O服務(wù)。針對(duì)標(biāo)準(zhǔn)設(shè)備的服務(wù)。針對(duì)標(biāo)準(zhǔn)設(shè)備的I/OI/O操作,須包含之。操作,須包含之。:包括包括istringstreamistringstream、ostringstreamostringstream、stringstreamstringstream的定義,要使用字符串流對(duì)象進(jìn)行針對(duì)內(nèi)存字符串空的定義,要使用字符串流對(duì)象進(jìn)行針對(duì)內(nèi)存字符串空間的間的I/OI/O操作,須包含此文件。操作,須包含此文件。:包括包括ifstream

11、ifstream、ofstreamofstream、fstreamfstream的定義,要使用文的定義,要使用文件流對(duì)象進(jìn)行針對(duì)磁盤文件的件流對(duì)象進(jìn)行針對(duì)磁盤文件的I/OI/O操作,須包含此文件。操作,須包含此文件。:包括包括setwsetw、fixedfixed等等操縱符的定義,利用操縱符進(jìn)行格等等操縱符的定義,利用操縱符進(jìn)行格式化式化I/OI/O操作,須包含之。操作,須包含之。6.2 文件輸入文件輸入/輸出流類輸出流類nC+在頭文件在頭文件fstream.h中定義了中定義了C+的文件流類體系的文件流類體系 ,當(dāng)程序中使用文件時(shí),當(dāng)程序中使用文件時(shí),要包含頭文件要包含頭文件fstream.h

12、 n當(dāng)使用文件時(shí),在程序頭有:當(dāng)使用文件時(shí),在程序頭有:#include 其中定義了各種文件操作運(yùn)算符及函數(shù)。其中定義了各種文件操作運(yùn)算符及函數(shù)。6.2 文件輸入文件輸入/輸出流類輸出流類nC+C+中負(fù)責(zé)文件輸入中負(fù)責(zé)文件輸入/ /輸出的類主要有:輸出的類主要有:ifstreamifstream文件輸入流類;文件輸入流類;ofstreamofstream文件輸出流類;文件輸出流類;fstreamfstream 文件輸入文件輸入/ /輸出流類。輸出流類。n要使用要使用fstreamfstream類執(zhí)行文件的類執(zhí)行文件的I/OI/O時(shí),必須定時(shí),必須定義一個(gè)義一個(gè)fstreamfstream類的對(duì)

13、象類的對(duì)象, ,由該對(duì)象與文件發(fā)由該對(duì)象與文件發(fā)生聯(lián)系,程序內(nèi)所有的與文件的操作都是對(duì)生聯(lián)系,程序內(nèi)所有的與文件的操作都是對(duì)該對(duì)象的操作。該對(duì)象的操作。如何使文件類的對(duì)象與欲操作的文件發(fā)生聯(lián)系?如何使文件類的對(duì)象與欲操作的文件發(fā)生聯(lián)系?使用該對(duì)象調(diào)用使用該對(duì)象調(diào)用fstreamfstream類提供的成員函數(shù)類提供的成員函數(shù)openopen打開一個(gè)文件打開一個(gè)文件:ifstream infile; /定義輸入文件類對(duì)象定義輸入文件類對(duì)象infile.open(“myfile1.txt”);/利用函數(shù)打開某一文件利用函數(shù)打開某一文件打開文件的作用是,使文件流對(duì)象與要使用的文打開文件的作用是,使文件

14、流對(duì)象與要使用的文件名之間建立聯(lián)系。件名之間建立聯(lián)系。ofstream outfile; /定義輸出文件類對(duì)象定義輸出文件類對(duì)象outfile.open(“myfile1.txt”);/打開某一文件供輸出打開某一文件供輸出打開輸入文件時(shí),文件必須存在。打開輸入文件時(shí),文件必須存在。打開輸出文件時(shí),若文件不存在,則建打開輸出文件時(shí),若文件不存在,則建立文件;若文件存在,則刪除原文件的立文件;若文件存在,則刪除原文件的內(nèi)容,使其成為一個(gè)空文件。內(nèi)容,使其成為一個(gè)空文件。infile.open(“myfile1.txt”);打開文件打開文件“myfile1.txt”用于輸入,并將這個(gè)文件用于輸入,并

15、將這個(gè)文件與輸入文件類對(duì)象與輸入文件類對(duì)象infile建立聯(lián)系,今后,建立聯(lián)系,今后,在程序在程序中,用到這個(gè)文件中,用到這個(gè)文件“myfile1.txt”的地方就用的地方就用infile來代替。來代替。outfile.open(“myfile2.txt”);打開文件打開文件“myfile2.txt”用于輸出,并將這個(gè)文件用于輸出,并將這個(gè)文件與輸出文件類對(duì)象與輸出文件類對(duì)象outfile建立聯(lián)系,今后,建立聯(lián)系,今后,在程在程序中,用到這個(gè)文件序中,用到這個(gè)文件“myfile2.txt”的地方就用的地方就用outfile來代替。來代替。如何從文件中輸入輸出數(shù)據(jù)?如何從文件中輸入輸出數(shù)據(jù)?將文

16、件類對(duì)象看成鍵盤和顯示器即可。將文件類對(duì)象看成鍵盤和顯示器即可。ifstream infile; /定義輸入文件類對(duì)象定義輸入文件類對(duì)象infile.open(“myfile1.txt”);/利用函數(shù)打開某一文件利用函數(shù)打開某一文件float x , y;infilexy;myfile1.txt3 4內(nèi)存內(nèi)存infilexy34用用infile代替代替myfile1.txt進(jìn)行操作。進(jìn)行操作。ifstream outfile; /定義輸出文件類對(duì)象定義輸出文件類對(duì)象infile.open(“myfile2.txt”);/利用函數(shù)打開某一文件利用函數(shù)打開某一文件 float x3 , y4;ou

17、tfilextyxy;outfilextyendl;infile.close();outfile.close();infile.close();outfile.close();nopenopen函數(shù)的參數(shù)可以有兩個(gè),一個(gè)表示欲打函數(shù)的參數(shù)可以有兩個(gè),一個(gè)表示欲打開的磁盤文件的名稱,另一個(gè)表示打開該文開的磁盤文件的名稱,另一個(gè)表示打開該文件的模式。例如:件的模式。例如: fstreamfstream file; file; file.open(“Myfile.txt”,ios:infile.open(“Myfile.txt”,ios:in););n可用位或運(yùn)算符可用位或運(yùn)算符 OR (|)OR

18、(|)運(yùn)算符運(yùn)算符 將一些模式參數(shù)組合成一個(gè)模式參數(shù)將一些模式參數(shù)組合成一個(gè)模式參數(shù): file.open(“MyFile.txt”, ios:in|ios:out|ios:binary);nfstreamfstream類繼承了類繼承了istreamistream與與ostreamostream類中處理數(shù)據(jù)類中處理數(shù)據(jù)流輸入和輸出的成員函數(shù),因此可以實(shí)現(xiàn)文件的讀流輸入和輸出的成員函數(shù),因此可以實(shí)現(xiàn)文件的讀寫等操作。下表列出了寫等操作。下表列出了fstreamfstream類中的一些常用的類中的一些常用的文件處理函數(shù)。文件處理函數(shù)。n例例6-1 文件的操作文件的操作 #inlude #inclu

19、de using namespace std; void main() const int size=10; fstream file; /定義文件流類對(duì)象定義文件流類對(duì)象 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(“Myfile.txt”,ios:in); file.read(str_in,size); file.close();

20、 cout“Reading data from filen”str_inend;6.3.3 二進(jìn)制模式的文件二進(jìn)制模式的文件I/O 在二進(jìn)制模式下,可利用在二進(jìn)制模式下,可利用writewrite函數(shù)將內(nèi)存函數(shù)將內(nèi)存中的數(shù)據(jù)以二進(jìn)制串的形式直接輸出到文件里中的數(shù)據(jù)以二進(jìn)制串的形式直接輸出到文件里存儲(chǔ),也可以用存儲(chǔ),也可以用readread從文件中以二進(jìn)制串的形從文件中以二進(jìn)制串的形式讀入數(shù)據(jù)到內(nèi)存中。式讀入數(shù)據(jù)到內(nèi)存中。 #include #include #include #include #include #include /格式化輸入格式化輸入/ /出控制頭文件出控制頭文件 using

21、namespace std; using namespace std; void main() void main() fstreamfstream file; file; char name48=“ char name48=“Mary”,“JohnMary”,“John”, ”, “Judy”“Judy”,“Joe”;Joe”; intint id4=100,200,300,400; id4=100,200,300,400; file.open(“List.txt”,ios:out|ios:binary|ios:trunc); /打開文件為二進(jìn)制輸出模式打開文件為二進(jìn)制輸出模式if(?。ǎ

22、ile) 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;int tid;file.open(“List.txt”,ios:in|ios:binary); /打開文件為二進(jìn)制輸出模式打開文件為二進(jìn)制輸出模式if(!(!file) cerr“Cant open file!n”; exit(1); coutsetw(4)se

23、tiosflag(ios:right)“ID” setw(8) setiosflag(ios:right)“Name”endl;cout“-n”;file.read(char*)&tid, sizeof(int); /先讀取一筆數(shù)據(jù)先讀取一筆數(shù)據(jù)file.read(tname, 8*sizeof(char);while (!file.eof() /循環(huán)讀取記錄,直到文件結(jié)尾循環(huán)讀取記錄,直到文件結(jié)尾 coutsetw(4)setioflags(ios:right)tid; setw(8) setioflags(ios:right)tnameendl; file.read(char*)&

24、amp;tid,sizeof(int); file.read(tname,8*sizeof(char);file.close();6.4 模板和標(biāo)準(zhǔn)模板庫模板和標(biāo)準(zhǔn)模板庫6.4.1 模板的概念模板的概念n模板模板是對(duì)具有相同特性的類或函數(shù)的一般性是對(duì)具有相同特性的類或函數(shù)的一般性 描述描述, ,一個(gè)模板并非一個(gè)實(shí)實(shí)在在的類或函數(shù),一個(gè)模板并非一個(gè)實(shí)實(shí)在在的類或函數(shù),而是而是公式化公式化或或抽象化抽象化或或參數(shù)化參數(shù)化的類或函數(shù)。的類或函數(shù)。n模板模板可以分為可以分為類模板類模板和和函數(shù)模板函數(shù)模板。n類模板類模板是為一組數(shù)據(jù)屬性相似但某些數(shù)據(jù)類型是為一組數(shù)據(jù)屬性相似但某些數(shù)據(jù)類型不同的類抽象定

25、義的一種不同的類抽象定義的一種公式化類公式化類或或抽象類抽象類。在類模板中某些數(shù)據(jù)成員、某些成員函數(shù)的參在類模板中某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)或返回值類型可取任意類型數(shù)或返回值類型可取任意類型。因此,。因此,類模板類模板是數(shù)據(jù)類型是數(shù)據(jù)類型抽象化抽象化或或參數(shù)化參數(shù)化的類的類。n例例8-2 8-2 已知兩個(gè)類已知兩個(gè)類A A和和B B的定義的定義, ,用類模板對(duì)這用類模板對(duì)這兩個(gè)類進(jìn)行抽象定義。兩個(gè)類進(jìn)行抽象定義。class A public: A(int y):x(y) private: int x; class B public: B(double y): x(y) private:

26、double x; /用類模板實(shí)現(xiàn)用類模板實(shí)現(xiàn)template class C public: C(T y): x(y) private: T x; C a; - A a;C b; - B b;6.4.2 標(biāo)準(zhǔn)模板庫標(biāo)準(zhǔn)模板庫STLnSTL STL 是是Standard Template LibraryStandard Template Library的縮寫的縮寫, ,表示表示標(biāo)準(zhǔn)模板庫標(biāo)準(zhǔn)模板庫,它由許多模板組成。它能夠它由許多模板組成。它能夠滿足軟件開發(fā)的實(shí)際需要,是一種強(qiáng)健和高效滿足軟件開發(fā)的實(shí)際需要,是一種強(qiáng)健和高效的的C+C+程序庫。程序庫。n該庫包含了許多在計(jì)算機(jī)科學(xué)領(lǐng)域里常用的基

27、該庫包含了許多在計(jì)算機(jī)科學(xué)領(lǐng)域里常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法。為廣大本數(shù)據(jù)結(jié)構(gòu)和基本算法。為廣大C+C+程序員們程序員們提供了一個(gè)可擴(kuò)展的應(yīng)用框架,高度體現(xiàn)了軟提供了一個(gè)可擴(kuò)展的應(yīng)用框架,高度體現(xiàn)了軟件的可重用性。件的可重用性。 n利用利用STLSTL開發(fā)程序可以提高代碼的重用度,讓開發(fā)程序可以提高代碼的重用度,讓程序更加穩(wěn)定,便于維護(hù),提高編寫程序的效程序更加穩(wěn)定,便于維護(hù),提高編寫程序的效率。率。nSTLSTL包含了一系列的容器類(包含了一系列的容器類(containerscontainers),算法),算法(algorithmsalgorithms)和迭代器()和迭代器(iterator

28、siterators)。)。例如,例如,STLSTL定義了容器類定義了容器類 list-list-線性表類模板,線性表類模板,用這個(gè)類模板可定義一個(gè)線性表:用這個(gè)類模板可定義一個(gè)線性表: listpersonlist AllPersonAllPerson; ; /用于存儲(chǔ)用于存儲(chǔ)personperson類對(duì)象指針的線性表類對(duì)象指針的線性表n在線性表類中,還定義了在線性表類中,還定義了迭代器類迭代器類-iteratoriterator 類類。 可用迭代器類來定義可用迭代器類來定義迭代器變量迭代器變量。迭代器變量迭代器變量有點(diǎn)有點(diǎn)像指針,算法通過迭代器變量來定位和操控容器中像指針,算法通過迭代器變

29、量來定位和操控容器中的元素。例如,下列語句定義了一個(gè)迭代器變量的元素。例如,下列語句定義了一個(gè)迭代器變量(或指針變量)(或指針變量): list:iterator AllPersonIterator; int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPserson.end(); +AllPersonIterator) sum+; 6.5 校園信息管理系統(tǒng)中的數(shù)據(jù)存儲(chǔ)校園信息管理系統(tǒng)中的數(shù)據(jù)存儲(chǔ) 通過前面的工作,我們的校園信息管理系統(tǒng)通過前面的工作,我們的校園信息管理系統(tǒng)已經(jīng)能夠完成人員信息的輸

30、入和顯示等一系列操已經(jīng)能夠完成人員信息的輸入和顯示等一系列操作,但現(xiàn)在的程序并不能將信息長期保存,即程作,但現(xiàn)在的程序并不能將信息長期保存,即程序關(guān)閉時(shí)數(shù)據(jù)會(huì)全部丟失。對(duì)于一個(gè)數(shù)據(jù)龐大的序關(guān)閉時(shí)數(shù)據(jù)會(huì)全部丟失。對(duì)于一個(gè)數(shù)據(jù)龐大的校園信息管理系統(tǒng)來說,不可能在每次程序運(yùn)行校園信息管理系統(tǒng)來說,不可能在每次程序運(yùn)行時(shí)都重新輸入全部信息。所以,校園信息管理系時(shí)都重新輸入全部信息。所以,校園信息管理系統(tǒng)應(yīng)該實(shí)現(xiàn)數(shù)據(jù)的永久保存功能。統(tǒng)應(yīng)該實(shí)現(xiàn)數(shù)據(jù)的永久保存功能。 要想長期保存對(duì)象數(shù)據(jù),必須在程序運(yùn)行結(jié)要想長期保存對(duì)象數(shù)據(jù),必須在程序運(yùn)行結(jié)束時(shí)將對(duì)象中的數(shù)據(jù)全部寫入磁盤文件,以后程束時(shí)將對(duì)象中的數(shù)據(jù)全部寫

31、入磁盤文件,以后程序運(yùn)行時(shí)又可以讀出這些數(shù)據(jù)。這樣可以實(shí)現(xiàn)數(shù)序運(yùn)行時(shí)又可以讀出這些數(shù)據(jù)。這樣可以實(shí)現(xiàn)數(shù)據(jù)的永久保存。據(jù)的永久保存。n在設(shè)計(jì)在設(shè)計(jì)person,studentperson,student和和teacherteacher類時(shí),已聲明了如類時(shí),已聲明了如下函數(shù),但尚未定義下函數(shù),但尚未定義:l void Save(ofstream* ofile);-將對(duì)象數(shù)據(jù)寫出到將對(duì)象數(shù)據(jù)寫出到文件中文件中。l void Load(ifstream* ifile); -從文件中讀入數(shù)據(jù)。從文件中讀入數(shù)據(jù)。n 要存儲(chǔ)對(duì)象就是要將每個(gè)成員變量的值都存入文件要存儲(chǔ)對(duì)象就是要將每個(gè)成員變量的值都存入文件中

32、,比如以字符串形式存入文件中,比如以字符串形式存入文件。 class person public: char name10; char sex10; char address100; date birthday; ptype type; virtual void Save(ofstream* ofile); virtual void Load(ifstream* ifile); ;void person:Save(ofstream* ofile) ofile-write(char*)&type,sizeof(type);int len=0;len=strlen(name);ofile-

33、write(char*)&len, sizeof(int);ofile-write(name,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:Load(ifstream* ifile

34、)/將文件的信息讀出將文件的信息讀出 int len=0;ifile-read(char*)&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 s

35、tudent:Save(ofstream* ofile)person:Save(ofile); /先調(diào)用基類先調(diào)用基類Save函數(shù)函數(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 stu

36、dent:Load(ifstream* ifile) / 讀入數(shù)據(jù)讀入數(shù)據(jù)person:Load(ifile); /先調(diào)用基類先調(diào)用基類Save函數(shù)函數(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 teacher:Save(o

37、fstream* ofile) /寫入文件寫入文件person:Save(ofile);/先調(diào)用基類先調(diào)用基類Save函數(shù)函數(shù) ofile-write(char*)&tregister, sizeof(date);void teacher:Load(ifstream* ifile) / 讀入數(shù)據(jù)讀入數(shù)據(jù) person:Load(ifile); /先調(diào)用基類先調(diào)用基類Save函數(shù)函數(shù) ifile-read(char*)&tregister, sizeof(date);void main() char cmd64;cout歡迎進(jìn)入校園信息管理系統(tǒng)歡迎進(jìn)入校園信息管理系統(tǒng)v1.0en

38、dl;cout請(qǐng)選擇你要進(jìn)行的操作:請(qǐng)選擇你要進(jìn)行的操作:endl;do cout; 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 i

39、f ( strcmp(cmd,save)=0 ) saveCMD(); else if ( strcmp(cmd,load)=0 ) loadCMD(); else cout錯(cuò)誤:無指定命令,輸入錯(cuò)誤:無指定命令,輸入help查看幫助!查看幫助!endl;while(true); #include /引用類庫引用類庫list,通過,通過std調(diào)用調(diào)用using namespace std;list AllPerson; /定義線性表對(duì)象定義線性表對(duì)象void inputCMD() /輸入數(shù)據(jù)輸入數(shù)據(jù) coutA輸入學(xué)生信息輸入學(xué)生信息endl; coutB輸入教師信息輸入教師信息bInfo;i

40、f (bInfo=a| bInfo=A) student* s=new student(); /創(chuàng)建學(xué)生對(duì)象創(chuàng)建學(xué)生對(duì)象 s-Read(); /輸入學(xué)生數(shù)據(jù)輸入學(xué)生數(shù)據(jù) AllPerson.push_back(person*)s); /將對(duì)象實(shí)例存入順序表將對(duì)象實(shí)例存入順序表 cout成功輸入學(xué)生信息成功輸入學(xué)生信息Read(); /輸入教師數(shù)據(jù)輸入教師數(shù)據(jù) AllPerson.push_back(person*)t); /將對(duì)象實(shí)例存入順序表將對(duì)象實(shí)例存入順序表 cout成功輸入教師信息成功輸入教師信息endl; else cout輸入失??!請(qǐng)選擇輸入學(xué)生輸入失?。≌?qǐng)選擇輸入學(xué)生或教師信息或

41、教師信息endl; void outputCMD() /輸出數(shù)據(jù)輸出數(shù)據(jù) list :iterator AllPersonIterator;int i=0;for(AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) i+; cout-NO.i-Show(); /調(diào)用鏈表顯示輸入的數(shù)據(jù)調(diào)用鏈表顯示輸入的數(shù)據(jù) void analyzeCMD() /統(tǒng)計(jì)分析數(shù)據(jù)統(tǒng)計(jì)分析數(shù)據(jù) list :iterator AllPersonIterator;int sum=0, nst

42、u=0, ntea=0; /初始化計(jì)數(shù)初始化計(jì)數(shù)for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) if (*AllPersonIterator)-type=STUDENT) nstu+; /如果是學(xué)生,學(xué)生人數(shù)加如果是學(xué)生,學(xué)生人數(shù)加1if (*AllPersonIterator)-type=TEACHER) ntea+;/如果是教師,教師人數(shù)加如果是教師,教師人數(shù)加1 sum+;/總?cè)藬?shù)加總?cè)藬?shù)加1cout當(dāng)前總?cè)藬?shù)為:當(dāng)前總?cè)藬?shù)為:sumendl;cout其中教師共:其中教師共:ntea人,人,“ 學(xué)生共:學(xué)生共:nstu人,人,endl;void saveCMD() /將數(shù)據(jù)存入文件將數(shù)據(jù)存入文件 ofstream ofile(person.dat, ios: binary|ios:trunc); list :iterator AllPersonIterator;int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonItera

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論