第10章輸入輸出流與文件—2_第1頁
第10章輸入輸出流與文件—2_第2頁
第10章輸入輸出流與文件—2_第3頁
第10章輸入輸出流與文件—2_第4頁
第10章輸入輸出流與文件—2_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、10.4 10.4 流的錯誤狀態(tài)流的錯誤狀態(tài) 在開發(fā)軟件時,設(shè)計者需要考慮到用戶在使用時可能 輸入或提供錯誤的數(shù)據(jù),軟件應(yīng)當(dāng)有一定的容錯能力, 以提高其穩(wěn)健性。通常程序在運行過程中,數(shù)據(jù)輸入或 輸出的許多環(huán)節(jié)都可能出現(xiàn)錯誤,為此C+提供了專門的 流錯誤狀態(tài)標(biāo)識與測試方法。與流的格式狀態(tài)控制方法 相似,流類庫中定義了多個錯誤狀態(tài)位標(biāo)志流的錯誤狀 態(tài)并控制流的輸入與輸出。 10.4 10.4 流的錯誤狀態(tài)流的錯誤狀態(tài) 錯誤標(biāo)志含 義 ios:goodbit數(shù)據(jù)流無錯誤,eofbit、failbit、badbit均沒有設(shè)置時,goodbit 被設(shè)置 ios:eofbit數(shù)據(jù)流已遇到文件尾(end-o

2、f-file) ios:failbit數(shù)據(jù)流發(fā)生格式錯誤,屬于可恢復(fù)錯誤,數(shù)據(jù)不丟失 ios:badbit數(shù)據(jù)流發(fā)生不可恢復(fù)錯誤,數(shù)據(jù)丟失 VC+ 2010在ios類中定義了一組枚舉常量,用于表 示流錯誤,表10-6列出了流中定義的錯誤標(biāo)志符和含義。 10.4 10.4 流的錯誤狀態(tài)流的錯誤狀態(tài) 流的錯誤狀態(tài)可以通過ios類提供的成員函數(shù)進行測 試或設(shè)置,常見的流錯誤狀態(tài)檢測和修改函數(shù)見表10-7。 函數(shù)原型功 能 int rdstate() const返回流的當(dāng)前錯誤狀態(tài)位 void clear(int s=0) 設(shè)置流的錯誤狀態(tài)為指定值,默認(rèn)為ios:goodbit int good()

3、const返回流的錯誤狀態(tài)值,值為1表示正常,為0表示流錯誤 int eof() const若遇到文件尾(eofbit位為1),返回值1(true),否則返回0(false) int fail() const若流格式非法或流失敗(failbit或badbit位為1),返回值1,否則為0 int bad() const如果流操作失敗(badbit位為1),返回值1,否則為0 10.4 10.4 流的錯誤狀態(tài)流的錯誤狀態(tài) 【例10-7】流錯誤狀態(tài)標(biāo)志符和操作函數(shù)應(yīng)用示例。 l 程序說明: (1)從運行結(jié)果可知,ios:eofbit的值為0 x01,ios:failbit的值為 0 x02,ios:

4、badbit的值為0 x04,ios:goodbit的值為0。表明流 錯誤狀態(tài)字的0號位為eof標(biāo)志位,1號位為fail標(biāo)志位,2號位 為bad標(biāo)志位。當(dāng)這些標(biāo)志位均為清空狀態(tài)時(值為0),流的 狀態(tài)為good。 (2)在程序運行結(jié)果中,還顯示了cin在沒有任何操作時和輸入錯 誤數(shù)據(jù)后,錯誤狀態(tài)位的情況。流狀態(tài)測試函數(shù)rdstate()讀 出狀態(tài)字的設(shè)置情況。當(dāng)eof()、fail()和bad()這3個函數(shù)均返回 0時,good()返回1,否則good()返回0。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 C+的標(biāo)準(zhǔn)I/O流類庫中設(shè)計了專門用于文件處理的類 ifstream、ofs

5、tream和fstream,它們?yōu)槌绦騿T提供了安全、 高效、靈活的文件I/O,屏蔽了文件操作的復(fù)雜過程。 10.5.1 文件的基本操作 類似于流格式控制標(biāo)志設(shè)置方法,C+中定義了一組枚 舉常量,用于控制文件的打開和定位等相關(guān)操作,通過它 們可以設(shè)置文件流中用于控制文件操作方式的標(biāo)志位,表 10-8列出了ios中定義的枚舉常量及其含義。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 操作標(biāo)志含 義 ios:in打開文件用于輸入 ios:out打開文件用于輸出 ios:ate打開文件用于輸出,文件指針移到文件尾,數(shù)據(jù)可以寫入到文件的任何位置 ios:app打開文件用于輸出,新數(shù)據(jù)添加到文件

6、尾 ios:trunk打開文件并清空,文件不存在則建立新文件 ios:binary打開文件,用于二進制輸入或輸出 ios:beg文件開頭 ios:cur文件指針的當(dāng)前位置 ios:end文件結(jié)尾 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 l C+把文件視為有序的字節(jié)流。當(dāng)打開一個文件時,程序 需要創(chuàng)建一個文件流對象與之關(guān)聯(lián)。流對象為程序提供 了便捷地操作文件或設(shè)備的渠道。實事上,標(biāo)準(zhǔn)輸入流 對象cin允許程序從鍵盤或其他設(shè)備輸入數(shù)據(jù),標(biāo)準(zhǔn)輸出 流對象cout允許程序把數(shù)據(jù)輸出到屏幕或其他設(shè)備。與標(biāo) 準(zhǔn)輸入/輸出設(shè)備相似,文件流對象可視為是程序與文件 之間進行數(shù)據(jù)交換的橋梁。 l 文

7、件流在進行輸入/輸出操作時,受到一個文件位置指針 (File Position Pointer)的控制。輸入流中的指針簡稱為讀指 針,每一次提取操作均始于讀指針當(dāng)前所指位置,并且 讀指針自動向后(文件尾)移動。 l 輸出流中的指針簡稱為寫指針,每一次插入操作也是始 于寫指針的當(dāng)前位置,并且指針也是自動向后移動的。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 l 文件位置指針是一個整數(shù)值,它是用相對于文件起始位置的字 節(jié)數(shù)表示的,是文件起始位置的偏移量。 l 在程序代碼中,完成文件輸入/輸出的代碼段通常有3個主要部 分,即文件“打開”、“使用”和“關(guān)閉”。下面分別給出各 階段的主要任務(wù)

8、和實現(xiàn)方法。 1. 打開文件 打開文件的第一步,是先用文件流定義一個對象,然后再使用該 文件流對象的成員函數(shù)打開一個外存上的文件,建立流對象與文件 的關(guān)聯(lián)。標(biāo)準(zhǔn)流類庫中用于文件操作的流主要有如下3種。 l ifstream:該類僅用于文件輸入。 l ofstream:該類僅用于輸出。 l fstream:該類既可輸入又可輸出。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 l 用流對象打開文件的方法有兩種:一種是用流提供的open() 成員函數(shù),另一種是用流的構(gòu)造函數(shù),在定義對象時同時打 開文件。 l open()函數(shù)的原型如下: void open(const char *_File

9、name, int _Mode, int _Prot); 其中:_Filename為文件名,_Mode為打開模式,_Prot為打 開文件的保護方式,通常取默認(rèn)值。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 l 下面給出幾個文件打開示例: /默認(rèn)以ios:in方式打開文件,文件不存在時操作失敗 ifstream infile(d:stu.txt); /默認(rèn)以ios:out的方式打開文件 ofstream outfile; outfile.open(d:result.txt); /以讀寫方式打開二進制文件 fstream myfile(d:sj.dat, ios:in|ios:out|

10、ios:binary); /以讀寫方式打開文本文件 fstream mf; mf.open(e:exampletest.cpp, ios:in|ios:out); 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 l 文件在打開過程中可能出現(xiàn)錯誤。例如指定的文件不存在 ,或沒有讀寫權(quán)限,或磁盤空間不足。處理文件打開異常 的常用方法是對流對象進行測試,用ios的運算符重載成員 函數(shù)operator!可判定與流對象關(guān)聯(lián)的文件是否被正確地打 開。如果在流對象的打開操作后failbit位或badbit位被設(shè) 置,則operator!函數(shù)返回true。測試代碼的框架如下: if(!myfile) c

11、out 源文件存在,程序運行結(jié)束! ch) cout 狀態(tài)下,輸入Example10_8,窗口中顯示 test.cpp中的內(nèi)容。 利用操作系統(tǒng)的重定向功能,可以將程序的運 行結(jié)果輸出至文件。在E:提示符下輸入Example10_8 result.cpp,則窗口不顯示test.cpp,而在e:下多出 一個result.cpp文件,該文件內(nèi)容與test.cpp相同。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 10.5.2 文本文件的輸入和輸出 文本文件是C+文件輸入/輸出的默認(rèn)模式。文本文件的 存儲方法比較簡單,它是以字節(jié)為單位依次存儲字符的編碼 。例如,在文本文件中,英文字母A存儲的

12、是其ASCII編碼值 0 x41,漢字“啊”是用兩個字節(jié)存儲了其機內(nèi)碼0 xB0A1,而 浮點數(shù)123.4則是用5個字節(jié)存儲了每個字符的ASCII編碼。下 面通過一個簡單的實驗,來驗證文本文件的存儲方式。 用系統(tǒng)的記事本程序建立一個文本文件tmp.txt,向其中 輸入“A啊123.4”再按Enter鍵。啟動命令提示符程序,輸入 debug tmp.txt,如圖10-3所示。在減號后輸入d并回車,第一 行13CB:0100 41 B0 A1 31 32 33 2E 34-0D 0A 00 00 00 00 00 00內(nèi) 容顯示了tmp.txt文件中保存的信息。 10.5 10.5 文件的輸入和輸

13、出文件的輸入和輸出 l 用ifstream類對象打開輸入文件后,從文件中讀取數(shù)據(jù)的方 法與cin相同。用ofstream類對象打開輸出文件后,向文件 寫入數(shù)據(jù)的方法與cout用法基本一樣。 l 對于用戶自定義的類,如果在類中重載了插入與提取運算 符,則該類的對象即可方便地進行格式化或非格式化的輸 入或輸出。 【例10-9】設(shè)計一個商品信息管理程序,用文本文件保存 基本信息。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 程序說明: (1) 由于在Commodity類中重載了插入和提取運算符,使得主 函數(shù)中可以用和函數(shù)中,is.read(stu.stuNo, 11);語句從文件讀入數(shù)據(jù)到

14、stuNo。在重載的operator),該函數(shù) 是為對象在容器vector中進行排序提供支持。主函數(shù)的 sort(myVector.begin(), myVector.end(), greater();語句中的greater()函數(shù)需要 調(diào)用operator函數(shù)。 10.5 10.5 文件的輸入和輸出文件的輸入和輸出 (3) 主函數(shù)中的ioFilestuArrayn+;語句則是利用提取運算符重載函數(shù)從 文件中讀取信息輸入到Student對象數(shù)組中。 (4) 主函數(shù)fstream ioFile(.)語句中的ios:in | ios:out | ios:binary表示以輸入和輸出方式打開二進制文

15、件。打開的 文件必須存在,系統(tǒng)不能自動創(chuàng)建,否則條件!ioFile為真 ,程序結(jié)束運行。 (5) toupper(ch)函數(shù)的作用是將小寫英文字母字符轉(zhuǎn)換為大寫 字符,如果ch已是大寫字符則保持不變。 10.6 10.6 字符串流字符串流 l 標(biāo)準(zhǔn)流類庫中,除支持標(biāo)準(zhǔn)設(shè)備和文件輸入/輸出的流外 ,C+的流I/O還包括把字符串輸入/輸出至內(nèi)存的功能。 由于字符串I/O與內(nèi)存相關(guān),故字符串流也稱為內(nèi)存流。 l C+中的字符串有兩種處理方式,一種是源于C語言的字 符數(shù)組方式,另一種是基于面向?qū)ο蠹夹g(shù)的string類方式 。相應(yīng)地,C+標(biāo)準(zhǔn)庫中有兩種字符串流,分別支持不同 類型字符串的輸入/輸出?;?/p>

16、std:string編寫的流在 sstream文件中定義,基于C類型字符串char*編寫的流包 含于strstream文件中。雖然兩種字符串流處理的字符串類 型不同,但它們所實現(xiàn)的功能基本一樣。例如,str()函數(shù) 在ostrstream類中返回的是char*類型的字符串,而在 ostringstream類中返回的是std:string類型的字符串。 10.6 10.6 字符串流字符串流 l 與文件流類似,strstream中用于輸入/輸出的類有 istrstream、ostrstream和strstream,sstream中包含 istringstream、ostringstream和str

17、ingstream類。由于string 字符串的性能更好,因而一般情況下推薦使用std:string 類型的字符串。如果為了保持與C語言的兼容,使用 strstream也是不錯的選擇。 l 字符串流為程序員提供了在內(nèi)存中進行數(shù)據(jù)類型轉(zhuǎn)換和 數(shù)據(jù)驗證的手段,主要應(yīng)用于數(shù)值與字符串間的互相轉(zhuǎn) 換、驗證或修改讀入的數(shù)據(jù),以及模仿鍵盤輸入等。 【例10-11】用字符串流在內(nèi)存中完成字符串與數(shù)值間 的轉(zhuǎn)換,模仿鍵盤輸入。 10.6 10.6 字符串流字符串流 l 程序說明: (1) iostrStreamx;語句向x輸入浮點數(shù) 3243.8,字符a不是數(shù)值型字符,讀取到a處結(jié)束,字符串“a9” 沒有輸入至x中。 為不影響之后的數(shù)據(jù)輸入,程序中用iostrStream.ignore(100); 語句清空緩沖區(qū)中的字符,再用iostrStream.clear();清除流錯誤 標(biāo)志,否則其后的輸入輸出不能正常執(zhí)行,y的值為0。 程序段iostrStream“y+10=”myStr;演示 了數(shù)值轉(zhuǎn)換為字符串的方法,代碼與用cout和cin進行標(biāo)準(zhǔn)輸入 輸出十分相似。本書4.9節(jié)中已使用該方法輸入日期。 (2) iostrStream“jk20120

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論