版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第十四章
文件和流
14.1TheC++input/outputclasshierarchy
(C++輸入/輸出類層次結(jié)構(gòu))到目前為止,我們所用的輸入輸出語句都還是從鍵盤讀取數(shù)據(jù),然后在屏幕上顯示出來。程序把數(shù)據(jù)存儲在計算機(jī)的內(nèi)存中。當(dāng)程序終止的時候,內(nèi)存中的數(shù)據(jù)就會丟失,這樣,每次運(yùn)行程序的時候都要重新輸入這些數(shù)據(jù)。文件流的輸入和輸出文件使用外部存儲設(shè)備,例如,用硬盤和U盤來存儲數(shù)據(jù)。它們都是永久性的存儲設(shè)備,保存的數(shù)據(jù)在程序終止時不會丟失。14.1TheC++input/outputclasshierarchyC++沒有內(nèi)置的輸入/輸出(I/O)命令。在C++中,I/O命令被包含在類庫中?;恑os中有一些數(shù)據(jù)成員是用來描述狀態(tài)的,例如輸入/輸出流對象是否處于打開狀態(tài),以及是否已經(jīng)到達(dá)文件的末尾等。14.1TheC++input/outputclasshierarchy派生類istream向基類添加了一些從流中讀取數(shù)據(jù)的函數(shù)。它通過重載運(yùn)算符>>來從流中讀取內(nèi)置數(shù)據(jù)類型(char、int、float等)的數(shù)據(jù),從而提供基本的輸入處理操作。派生類ostream中包含的一些成員函數(shù)可用于向流中輸出數(shù)據(jù)。它通過重載運(yùn)算符<<來向流中輸出內(nèi)置數(shù)據(jù)類型的數(shù)據(jù),從而提供了基本的輸出處理操作。流cout是派生類ostream的對象,通常和屏幕輸出相關(guān)聯(lián)。14.1TheC++input/outputclasshierarchyifstream是從istream派生的類,用于創(chuàng)建輸入文件對象。ofstream則是從ostream派生的類,用于創(chuàng)建輸出文件對象。用于創(chuàng)建文件對象的類fstream,既能用于輸入也能用于輸出。庫類的定義包含在頭文件ostream和fstream中。14.2Openingafile(打開文件)打開文件首先要創(chuàng)建一個適當(dāng)?shù)念惖膶嵗趧?chuàng)建一個適當(dāng)?shù)念惖膶嵗螅仨毚蜷_該文件對象,將其和存儲在硬盤或其他存儲設(shè)備上的文件相關(guān)聯(lián)。創(chuàng)建文件對象的實例和打開文件可以合并為一條語句來完成,這可以通過使用類ifstream和ofstream的構(gòu)造函數(shù)來實現(xiàn)。14.2OpeningafileProgramExampleP14A第14行創(chuàng)建了一個輸出文件對象的實例out。第15行把out與一個外部文件file.txt關(guān)聯(lián),并且打開這個文件用于處理操作。如果該文件不存在,那么默認(rèn)情況下將在程序所在的同一文件夾(目錄)下創(chuàng)建這個文件。第18行按照將數(shù)據(jù)輸出到流對象cout中同樣的方式,使用<<將數(shù)據(jù)輸出到文件流中。第21行使用ifstream類的構(gòu)造函數(shù)來打開file.txt文件準(zhǔn)備進(jìn)行輸入操作。第23行讀取文件的方法和從鍵盤讀入數(shù)據(jù)的方法類似,唯一不同的就是用in代替了cin。14.3Fileerrorchecking(文件出錯檢查)可能發(fā)生的錯誤輸出設(shè)備上沒有可用的空間要讀取的文件并不存在
ios類中包含的一些成員函數(shù)可用來檢查這類錯誤。因為ifstream和ofstream繼承自ios類,所以這兩個類的對象也能使用這些成員函數(shù)。打開一個文件的時候,這是一個好方法去檢查錯誤!14.3Fileerrorchecking程序示例P14B:使用成員函數(shù)fail()來檢查打開文件時可能發(fā)生的錯誤。返回0值表示成功,返回非0值表示出現(xiàn)了一個錯誤。14.3FileerrorcheckingProgramExampleP14BTheadditionalprogramstatementscanbetestedbyaddinganon-existentstoragedeviceidentifiertothefilepath,e.g.insteadof"file.txt”specify"xx:/file.txt"onlines15and25.14.3FileerrorcheckingProgramExampleP14B14.4SinglecharacterI/Oanddetectingtheend
ofafile(單字符的I/O和文件末尾的檢測)從文件中讀取數(shù)據(jù)時,必須檢測是否到達(dá)了文件的末尾,以便結(jié)束對文件的處理操作。可以通過使用ios類的成員函數(shù)eof()來檢測文件的末尾,ifstream類也從ios類繼承了這個函數(shù)。程序示例P14C演示了在復(fù)制文本文件時函數(shù)eof()的作用。類istream的成員函數(shù)get()用于從輸入文件中讀取一個字符類ofstream的成員函數(shù)put()則負(fù)責(zé)將字符寫入到輸出文件中。14.4SinglecharacterI/Oanddetectingtheend
ofafile14.4SinglecharacterI/Oanddetectingtheend
ofafile
第26行讀取輸入文件的第一個字符。第28行至第33行繼續(xù)編寫字符到輸出文件,并從輸入文件讀取下一個字符,直到檢測到輸入文件的結(jié)束為止。程序可以通過使用一個更簡單的語句來提升比起使用第28行的語句。14.4SinglecharacterI/Oanddetectingtheend
ofafile程序示例P14E檢測文件末尾的方法同樣可以應(yīng)用于返回流引用的成員函數(shù)。使用流提取運(yùn)算符>>這個程序假設(shè)每個單詞之間用一個或者多個空白字符來分隔??瞻鬃址麜?gt;>忽略掉。14.4SinglecharacterI/Oanddetectingtheend
ofafileProgramExampleP14E…continued第21行到第25行的while循環(huán)將文件內(nèi)容連續(xù)顯示在屏幕上,直到文件尾為止。到達(dá)文件尾以后,while循環(huán)結(jié)束,將文件關(guān)閉。14.5Appendingdatatotheendofafile向文件(末尾添加數(shù)據(jù))為了向一個文件的末尾添加數(shù)據(jù),在打開文件的時候必須指定文件的打開模式。文件的打開模式在ios類中定義。14.5Appendingdatatotheendofafile可以通過使用按位或運(yùn)算符|來聯(lián)合使用多種打開模式。打開一個文件,使其既可用做輸入,也可用做輸出。默認(rèn)打開模式:
ifstream類對象的默認(rèn)打開模式是ios::inofstream類對象的默認(rèn)打開模式是ios::outProgramExampleP14F:demonstratesappendingtheline“Thislineisaddedtotheendofthefile”tothefilefile.txt.14.5Appendingdatatotheendofafile程序示例P14F:演示14.6Readinglinesfromafile(從文件中讀取行)getline()使用函數(shù)getline()可以從文件讀入一整行數(shù)據(jù)到C/C++字符串中。程序P14G:使用C++字符串存儲一行數(shù)據(jù)14.6ReadinglinesfromafileProgramExampleP14G…continued14.6Readinglinesfromafile程序示例P14H:使用C字符串目的相同。14.6ReadinglinesfromafileProgramExampleP14H…continued14.7Randomaccess(隨機(jī)存?。?/p>
順序文件處理在順序文件處理過程中,對數(shù)據(jù)項的讀/寫是一個接著一個進(jìn)行的。14.7Randomaccess隨機(jī)或直接存取允許在文件中隨意定位,在文件的任何位置讀寫數(shù)據(jù)。文件中的位置信息保存在文件位置標(biāo)記(FPM)中。seekg()(meaning‘seekget’)用來為輸入文件設(shè)定FPM,指示下一個要讀取的數(shù)據(jù)的位置。
istream類成員函數(shù)這個函數(shù)需要兩個實參第一個實參是一個偏移量,它告訴FPM要跳過多少字節(jié)。第二個實參確定偏移量計算的起始位置14.7Randomaccess例如:打開一個文件包含字符A到Jor14.7Randomaccessseekp()在輸出文件中用于設(shè)置FPM的函數(shù)是seekp()。tellg()用來返回輸入流中FPM的當(dāng)前值。tellp()用來返回輸出流中FPM的當(dāng)前值。14.7RandomaccessProgramExampleP14I14.7RandomaccessProgramExampleP14I14.7RandomaccessProgramExampleP14I注意:第43行使用強(qiáng)制類型轉(zhuǎn)換將變量c的值轉(zhuǎn)換成和它等價的整數(shù)即ASCII碼值。14.8ObjectI/O(對象I/O)在程序P10G中,通過重載運(yùn)算符>>和<<使類time24具有了鍵盤輸入和屏幕輸出的功能。如果對time24類不做修改,那么就需要使用磁盤文件來代替鍵盤和屏幕進(jìn)行輸入和輸出。程序示例P14J打開一個文件并從文件中寫入和讀取time24對象。14.8ObjectI/OProgramExampleP14JFromprogramP10HThefiletime24.hincludedonline5containsthetime24classdeclarationLine6includesthefiletime24.cppcontainingthetime24classmemberfunctionsLine14opensthefiletimes.datasanfstreamobjectforinputandoutput.14.8ObjectI/OProgramExampleP14J…continuedLine22writesthetime24objectst1andt2tothefile.Line28readstheobjectsbackfromthefileandline29displaystheobjects.14.9BinaryI/O(二進(jìn)制I/O)C++文件有兩種類型
文本文件(或者ASCII文件)以字符的ASCII碼形式存儲
二進(jìn)制文件
以二進(jìn)制形式存儲例如短整型變量n在內(nèi)存中占兩個字節(jié),變量n的值存儲在文本文件中則需要3個字節(jié)的內(nèi)存。14.9BinaryI/OASCII文件每一位數(shù)字都要占用一個字節(jié)的存儲空間。二進(jìn)制文件一個數(shù)據(jù)的每一位數(shù)字并不占用單獨(dú)的存儲單元,而是把整個數(shù)據(jù)作為一個二進(jìn)制數(shù)來存儲。例如:n=123n=1234:相同的存儲空間增加一個字節(jié)來存儲額外的數(shù)字4。00001001001001014.9.1Serialwritingofobjectstoabinaryfilewrite()帶有兩個實參的istream類的成員函數(shù)用于以二進(jìn)制格式寫一個對象第一個實參是存儲對象的內(nèi)存區(qū)域的地址,第二個實參是這個內(nèi)存區(qū)域的字節(jié)大小。Theobjectmustbestoredinonecontiguousblockofmemory(對象必須存儲在一塊連續(xù)的內(nèi)存區(qū)域中)對象不能有指向動態(tài)分配的內(nèi)存的指針數(shù)據(jù)成員。類不能有任何string數(shù)據(jù)成員,因為string類使用一個指針數(shù)據(jù)成員。14.9BinaryI/OProgramExampleP14K14.9BinaryI/OProgramExampleP14K在程序的第23行計算的是函數(shù)write()的第二個實參是內(nèi)存塊的字節(jié)數(shù)。14.9BinaryI/OProgramExampleP14K第41行的函數(shù)write()把stock對象看做是一整塊的內(nèi)存字節(jié)或字符,無需轉(zhuǎn)換為ASCII碼就可直接從內(nèi)存復(fù)制到磁盤文件中。14.9BinaryI/O函數(shù)write()的第一個實參是一個指向字符串的指針。由于對象被看成是字符塊,因此第i個stock對象的地址&stationery[i]被強(qiáng)制轉(zhuǎn)換成指向字符串的指針reinterpret_cast允許從任意指針類型轉(zhuǎn)換到其他任意指針類型。函數(shù)write()的第二個實參是內(nèi)存塊的字節(jié)數(shù)14.9BinaryI/O文件
stock.h
14.9BinaryI/O文件
stock.h
14.9BinaryI/O文件
stock.h
14.9BinaryI/O文件
stock.cpp
14.9BinaryI/O文件
stock.cpp
14.9BinaryI/O文件
stock.cpp
14.9BinaryI/O14.9.2Serialreadingofobjectsfromabinaryfileread()istream類的成員函數(shù)用于從二進(jìn)制文件中將對象的數(shù)據(jù)讀到內(nèi)存中。函數(shù)read()的實參和函數(shù)write()相同程序示例P14L:Demonstrationofserialreadingofabinaryfile.14.9BinaryI/OProgramExampleP14L14.9BinaryI/OProgramExampleP14L14.9BinaryI/O14.9.3BinaryI/Oasclassmemberfunctions如果將讀寫函數(shù)的細(xì)節(jié)隱藏在類的成員函數(shù)中,那么程序員使用二進(jìn)制I/O就比較容易了。stock.cppExample:modificationforP14KThebuilt-inpointerthisisapointertotheobjectthatinvokedthememberfunction,i.e.stationery[i]sizeof(*this)等價于sizeof(stationery[i])14.9BinaryI/Ostock.cpp例如:修改為P14L除從輸入流中讀取對象之外,函數(shù)binary_read()將在到達(dá)文件末尾時返回false,否則返回true。因此,while循環(huán)將一直執(zhí)行到文件尾為止。14.9BinaryI/O例如:修改為P14LTomakestock_fileanfstreamobjectasrequiredbythefunctionboolstock::binary_read().14.9.4Binaryfilerandomaccess(二進(jìn)制文件隨機(jī)存?。┯沙绦騊14K創(chuàng)建的文件結(jié)構(gòu)如下圖所示。相對文件存貨的代碼和存貨記錄在文件中的位置有關(guān)存貨代碼1為第1條記錄,存貨代碼2為第2條記錄,存貨代碼3為第3條記錄,……一個存貨記錄在文件中的偏移量可以用存貨代碼值減去1,然后乘以存貨記錄的字節(jié)大小來計算。14.9.4Binaryfilerandomaccess程序示例P14M:
演示了二進(jìn)制文件的存取14.9.4BinaryfilerandomaccessProgramExampleP14M14.9.4BinaryfilerandomaccessProgramExampleP14M
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 災(zāi)后飲用水衛(wèi)生監(jiān)督制度
- 煙花廠衛(wèi)生管理制度
- 衛(wèi)生院門診治療管理制度
- 衛(wèi)生標(biāo)準(zhǔn)及管理制度
- 寧夏衛(wèi)生院醫(yī)保管理制度
- 衛(wèi)生院新冠院感制度
- 街道辦事處衛(wèi)生工作制度
- 豬肉店衛(wèi)生管理制度
- 基層醫(yī)院衛(wèi)生制度
- 健身房衛(wèi)生獎罰制度
- 2025年住院醫(yī)師規(guī)范化培訓(xùn)考試(腎臟內(nèi)科)歷年參考題庫含答案詳解(5卷)
- 血液小學(xué)生課件
- 森林消防安全知識課件
- T-CRHA 089-2024 成人床旁心電監(jiān)測護(hù)理規(guī)程
- 燃?xì)夤艿廊毕菪迯?fù)技術(shù)-深度研究
- 刑事訴訟法學(xué)全套課件
- DBJ51-T 040-2021 四川省工程建設(shè)項目招標(biāo)代理操作規(guī)程
- 青鳥消防JBF62E-T1型測溫式電氣火災(zāi)監(jiān)控探測器使用說明書
- 武漢市江岸區(qū)2022-2023學(xué)年七年級上學(xué)期期末地理試題【帶答案】
- 自動駕駛系統(tǒng)關(guān)鍵技術(shù)
- 完整工資表模板(帶公式)
評論
0/150
提交評論