版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第6章 文件的輸入與輸出,本章的教學(xué)目的 內(nèi)存中的數(shù)據(jù)只能暫時存儲,關(guān)機后會自然消失。因此,要把數(shù)據(jù)永久地保留下來以備以后使用,唯一的辦法就是將數(shù)據(jù)輸出到文件里,以后要用數(shù)據(jù)時便可從文件中讀出。 C+編譯系統(tǒng)提供了一組實現(xiàn)文件輸入/輸出的類,那就是I/O流類庫,又稱I/O流庫。應(yīng)用I/O流庫,不僅能夠處理基本類型數(shù)據(jù)的輸入/輸出,還能處理用戶自定義類型數(shù)據(jù)的輸入/輸出。因此,我們應(yīng)該學(xué)習(xí)用C+的I/O流類實現(xiàn)的文件輸入與輸出方法。,本章的教學(xué)內(nèi)容,流的概念 文件輸入/輸出流類 二進制模式的文件輸入/輸出 校園信息管理系統(tǒng)中的數(shù)據(jù)輸入、輸出,6.1 流的概念,在C+中,將從一個對象到另一個對象的
2、數(shù)據(jù)流動抽象地表示為“流”或流對象。流動的方向不同,就產(chǎn)生不同的輸入/輸出流,即I/O流。 在C+程序中,數(shù)據(jù)可以從鍵盤或磁盤文件流入到程序,形成輸入流,也可以從程序流向屏幕或磁盤文件,形成輸出流。在C+程序中,數(shù)據(jù)的輸入/輸出就是通過I/O流來實現(xiàn)的。 一般地,每個流都是與某種設(shè)備相聯(lián)系的對象,與輸入設(shè)備(如鍵盤)相聯(lián)系的流稱為輸入流;與輸出設(shè)備(如屏幕、打印機)相聯(lián)系的流稱為輸出流;與輸入/輸出設(shè)備(如磁盤)相聯(lián)系的流稱為輸入/輸出流。 C+為每種輸入/輸出流定義了一個流類,用流類來描述這些流。C+的流類構(gòu)成一個流庫。,6.2 文件輸入/輸出流類,C+中負責(zé)文件輸入/輸出的類主要有: if
3、stream文件輸入流類; ofstream文件輸出流類; fstream 文件輸入/輸出流類。 要使用fstream類執(zhí)行文件的I/O時,必須定義一個fstream類的對象,然后使用該對象調(diào)用fstream類提供的成員函數(shù)open打開一個文件,open函數(shù)的參數(shù)有兩個,一個表示欲打開的磁盤文件的名稱,另一個表示打開該文件的模式。例如: fstream file; file.open(“Myfile.txt”,ios:in);,可用位或運算符 OR (|)運算符 將一些模式參數(shù)組合成一個模式參數(shù): file.open(“MyFile.txt”, ios:in|ios:out|ios:binar
4、y);,fstream類繼承了istream與ostream類中處理數(shù)據(jù)流輸入和輸出的成員函數(shù),因此可以實現(xiàn)文件的讀寫等操作。下表列出了fstream類中的一些常用的文件處理函數(shù)。,例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);
5、/將str_out寫入Myfile.txt file.close(); file.open(“Myfile.txt”,ios:in); file.read(str_in,size); file.close(); cout“Reading data from filen”str_inend;,6.3.3 二進制模式的文件I/O 在二進制模式下,可利用write函數(shù)將所有數(shù)據(jù)以字符形式存儲到文件里,如果數(shù)據(jù)原本就是字符數(shù)據(jù),不需要轉(zhuǎn)型就可以寫入到文件中;如果數(shù)據(jù)是數(shù)字型數(shù)據(jù),則必須將其轉(zhuǎn)化為字符串,再把它寫入到文件中??梢杂胷ead從文件中讀取數(shù)據(jù)。 #include #include #incl
6、ude /格式化輸入/出控制頭文件 using namespace std; void main() fstream file; char name48=“Mary”,“John”, “Judy”,“Joe”; int id4=100,200,300,400;,file.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*) ,coutsetw(4)setiosfl
7、ag(ios:right)“ID” setw(8) setiosflag(ios:right)“Name”endl; cout“-n”; file.read(char*) ,6.4 模板和標(biāo)準(zhǔn)模板庫,6.4.1 模板的概念 模板是對具有相同特性的類或函數(shù)的一般性 描述,一個模板并非一個實實在在的類或函數(shù),而是公式化或抽象化或參數(shù)化的類或函數(shù)。 模板可以分為類模板和函數(shù)模板。 類模板是為一組數(shù)據(jù)屬性相似但某些數(shù)據(jù)類型不同的類定義的一種公式化類或抽象類。在類模板中某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)或返回值類型可取任意類型。因此,類模板是數(shù)據(jù)類型抽象化或參數(shù)化的類。,例8-2 已知兩個類A和B的定義,
8、用類模板對這兩個類進行抽象定義。 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) private: T x; C a; - A a;C b; - B b;,6.4.2 標(biāo)準(zhǔn)模板庫STL,STL 是Standard Template Library的縮寫,表示標(biāo)準(zhǔn)模板庫,它由許多模板組成。它能夠滿足軟件開發(fā)的實際需要,是一種強健和高效的C+程序庫。 該庫包含
9、了許多在計算機科學(xué)領(lǐng)域里常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法。為廣大C+程序員們提供了一個可擴展的應(yīng)用框架,高度體現(xiàn)了軟件的可重用性。 利用STL開發(fā)程序可以提高代碼的重用度,讓程序更加穩(wěn)定,便于維護,提高編寫程序的效率。,STL包含了一系列的容器(containers),算法(algorithms)和迭代器(iterators)。 例如,STL定義了容器類 list-線性表類模板,用這個類模板可定義一個線性表: list AllPerson; /用于存儲person類對象指針的線性表,在線性表類中,還定義了迭代器類-iterator 類。 可用迭代器類來定義迭代器變量。迭代器變量有點像指針,算法通過
10、迭代器變量來定位和操控容器中的元素。例如,下列語句定義了一個迭代器變量(或指針變量): list:iterator AllPersonIterator; int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPserson.end(); +AllPersonIterator) sum+;,6.5 校園信息管理系統(tǒng)中的數(shù)據(jù)存儲,通過前面的工作,我們的校園信息管理系統(tǒng)已經(jīng)能夠完成人員信息的輸入和顯示等一系列操作,但現(xiàn)在的程序并不能將信息長期保存,即程序關(guān)閉時數(shù)據(jù)會全部丟失。對于一個數(shù)據(jù)龐大的校園信息管理
11、系統(tǒng)來說,不可能在每次程序運行時都重新輸入全部信息。所以,校園信息管理系統(tǒng)應(yīng)該實現(xiàn)數(shù)據(jù)的永久保存功能。 要想長期保存對象數(shù)據(jù),必須在程序運行結(jié)束時將對象中的數(shù)據(jù)全部寫入磁盤文件,以后程序運行時又可以讀出這些數(shù)據(jù)。這樣可以實現(xiàn)數(shù)據(jù)的永久保存。,在設(shè)計person,student和teacher類時,已聲明了如下函數(shù),但尚未定義: void Save(ofstream* ofile);-將對象數(shù)據(jù)寫出到文件中。 void Load(ifstream* ifile); -從文件中讀入數(shù)據(jù)。 要存儲對象就是要將每個成員變量的值都存入文件中,比如以字符形式存入文件。 class person publi
12、c: 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*),void person:Load(ifstream* ifile)/將文件的信息讀出 int len=0; ifile-read(char*) ,void student:Save(ofstream*
13、ofile) person:Save(ofile); /先調(diào)用基類Save函數(shù) int len=0; len=strlen(sclass); ofile-write(char*) ,void student:Load(ifstream* ifile) / 讀入數(shù)據(jù) person:Load(ifile); /先調(diào)用基類Save函數(shù) int len=0; ifile-read(char*) ,void teacher:Save(ofstream* ofile) /寫入文件 person:Save(ofile);/先調(diào)用基類Save函數(shù) ofile-write(char*) ,#include /引
14、用類庫list,通過std調(diào)用 using namespace std; list AllPerson; /定義線性表對象 void inputCMD() /輸入數(shù)據(jù) coutbInfo; if (bInfo=a| bInfo=A) student* s=new student(); /創(chuàng)建學(xué)生對象 s-Read(); /輸入學(xué)生數(shù)據(jù) AllPerson.push_back(person*)s); /將對象實例存入順序表 cout成功輸入學(xué)生信息endl; ,else if (bInfo=b |bInfo=B) teacher* t=new teacher(); /創(chuàng)建教師對象 t-Read(
15、); /輸入學(xué)生數(shù)據(jù) AllPerson.push_back(person*)t); /將對象實例存入順序表 cout成功輸入教師信息endl; else cout輸入失??!請選擇輸入學(xué)生或教師信息endl; ,void outputCMD() /輸出數(shù)據(jù) list :iterator AllPersonIterator; int i=0; for(AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) i+; coutShow(); /調(diào)用鏈表顯示輸入的數(shù)據(jù) ,v
16、oid analyzeCMD() /統(tǒng)計分析數(shù)據(jù) list :iterator AllPersonIterator; int sum=0, nstu=0, ntea=0; /初始化計數(shù) for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) if (*AllPersonIterator)-type=STUDENT) nstu+; /如果是學(xué)生,學(xué)生人數(shù)加1 if (*AllPersonIterator)-type=TEACHER) ntea+;/如果是教師
17、,教師人數(shù)加1 sum+;/總?cè)藬?shù)加1 cout當(dāng)前總?cè)藬?shù)為:sumendl; cout其中教師共:ntea人,“ 學(xué)生共:nstu人,endl;,void saveCMD() /將數(shù)據(jù)存入文件 ofstream ofile(person.dat, ios: binary|ios:trunc); list :iterator AllPersonIterator; int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) sum+; of
18、ile.write(char*),for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) (*AllPersonIterator)-Save( ,void loadCMD() /將數(shù)據(jù)從文件讀出 ifstream ifile(person.dat); list :iterator AllPersonIterator; int sum=0; ifile.read(char*),if (type=STUDENT) student* s=new student(); s-Load( ,void
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省資陽市安岳縣2025-2026學(xué)年九年級(上)期末化學(xué)試卷(含答案)
- 文化旅游知識題庫及答案
- 網(wǎng)絡(luò)視覺營銷題庫及答案
- 邊防部隊安全教育課件
- 2022~2023小學(xué)升初中考試題庫及答案第230期
- 2021至2022年鄂教版語文三年級上冊詩詞誦讀-宿建德江練習(xí)卷
- 2025 小學(xué)三年級科學(xué)下冊植物與動物的呼吸對比課件
- 輸血知識考試考題及答案
- 神經(jīng)系統(tǒng)評估試題及答案
- 妊娠期合并癥試題及答案
- 湖南省2025-2026學(xué)年七年級歷史上學(xué)期期末復(fù)習(xí)試卷(含答案)
- 2026年中國熱帶農(nóng)業(yè)科學(xué)院南亞熱帶作物研究所第一批招聘23人備考題庫完美版
- 2026新疆阿合奇縣公益性崗位(鄉(xiāng)村振興專干)招聘44人考試參考試題及答案解析
- 2026年上海高考英語真題試卷+解析及答案
- 紡織倉庫消防安全培訓(xùn)
- 護坡施工安全專項方案
- 2025年國網(wǎng)冀北電力有限公司招聘530人高校畢業(yè)生(第一批)筆試參考題庫附帶答案詳解(3卷)
- 中國腎移植排斥反應(yīng)臨床診療指南(2025版)
- 核心素養(yǎng)視域下高中歷史圖表教學(xué)的應(yīng)用研究答辯
- 2025 膜性腎病診斷與治療策略課件
- 地推銷售話術(shù)
評論
0/150
提交評論