版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章異常處理與I/O流
王建興閩江學(xué)院物理學(xué)與電子信息工程系7.1異常處理
異常處理過(guò)程,就是預(yù)防運(yùn)行時(shí)錯(cuò)誤的發(fā)生,即在錯(cuò)誤即將發(fā)生前通過(guò)檢測(cè)觸發(fā)它的條件來(lái)阻止它。C語(yǔ)言沒(méi)有內(nèi)置的運(yùn)行時(shí)錯(cuò)誤處理機(jī)制,一般采用下列的方法來(lái)處理可能的運(yùn)行時(shí)錯(cuò)誤:①
函數(shù)返回統(tǒng)一定義的狀態(tài)編碼來(lái)表操作成功、失敗或其他錯(cuò)誤信息。②
使用全局變量來(lái)保存錯(cuò)誤編碼,每一個(gè)使用到它的函數(shù)在開(kāi)始是時(shí)候都檢查它的值,并且每一個(gè)函數(shù)的結(jié)尾把狀態(tài)信息寫(xiě)回到這個(gè)全局變量中。③
出錯(cuò)時(shí)終止程序運(yùn)行。7.1.1異常處理的語(yǔ)法結(jié)構(gòu)
組成部分:拋出異常、提煉異常、捕獲異常以及異常類型
拋出異常
throw異常對(duì)象表達(dá)式;
throw語(yǔ)句的異常對(duì)象類型就是異常類型
7.1.1異常處理的語(yǔ)法結(jié)構(gòu)
提煉異常和捕獲異常
try{復(fù)合語(yǔ)句
}catch(異常類型
[名稱]){復(fù)合語(yǔ)句
}catch(異常類型
[名稱]){復(fù)合語(yǔ)句
}……【例7-1】
7.1.1異常處理的語(yǔ)法結(jié)構(gòu)從程序結(jié)果中可以看出,在異常發(fā)生時(shí),會(huì)自動(dòng)調(diào)用在try塊中從try到throw語(yǔ)句之間創(chuàng)建起來(lái)的局部對(duì)象的析構(gòu)函數(shù),從而正常的釋放內(nèi)存空間。如果在try塊中局部對(duì)象是動(dòng)態(tài)創(chuàng)建的,那么一般來(lái)說(shuō)就需要在相應(yīng)的catch塊中釋放內(nèi)存空間,特別是catch塊中有調(diào)用程序終止的語(yǔ)句時(shí)。
示例代碼7.1.2異常的類型匹配規(guī)則
C++規(guī)定:當(dāng)一個(gè)異常對(duì)象和catch子句參數(shù)類型符合下列條件時(shí),匹配成功:如果catch子句參數(shù)的類型就是異常對(duì)象的類型或其引用;如果catch子句參數(shù)類型是異常對(duì)象所屬類型的public基類;如果catch子句參數(shù)類型為基類指針或引用,而異常對(duì)象為派生類指針或引用;catch子句參數(shù)類型為void*,而異常對(duì)象為任何類型的指針;catch子句為catch-all,即catch(…)。示例7.1.2異常的類型匹配規(guī)則在異常組合中,要合理安排異常處理的層次:一定要把派生異常捕獲放在基類異常捕獲的前面,否則派生類異常匹配永遠(yuǎn)也不會(huì)執(zhí)行。如果實(shí)在無(wú)法判斷到底會(huì)有什么異常拋出,那就使用catch(void*)和catch(…),但是必須放在異常組合的最后面。
catch塊的參數(shù)應(yīng)當(dāng)采用引用傳遞而不是值傳遞。原因有二:一是異常對(duì)象可能會(huì)在調(diào)用鏈中上溯好幾個(gè)層次才能遇到匹配的處理塊,此時(shí)引用傳遞比值傳遞的效率高得多;二是可以利用異常對(duì)象的多態(tài)性,因?yàn)楫惓n愋涂赡苁嵌鄳B(tài)類??梢話伋鲆粋€(gè)異常對(duì)象的地址,那么catch塊中的參數(shù)就是異?;愋偷闹羔槨?.1.4異常處理的其它方面
異常類型和異常對(duì)象
任何一種類型都可以當(dāng)作異常類型,異常僅通過(guò)類型而不是通過(guò)對(duì)象的值來(lái)匹配的。
但是一般不使用基本數(shù)據(jù)類型的對(duì)象作為異常,因?yàn)樗鼈儽硎井惓5哪芰Σ蛔?;相反,總是自定義一些異常類來(lái)具體描述我們需要的異常類型?!纠?-3】
7.1.4異常處理的其它方面
異常說(shuō)明
異常說(shuō)明是為了加強(qiáng)程序的可讀性。DoubleDevide(doublex,
doubley)throw(DevidedByZero);//表示拋出一種異常BoolF(constchar*)throw(T1,
T2,
T3);//表示可能有三種異常①能清楚地告訴函數(shù)的調(diào)用者,該函數(shù)可能會(huì)拋出什么異常,以便用戶能夠編寫(xiě)正確的的異常處理結(jié)構(gòu)。②用戶一般無(wú)法看到函數(shù)的實(shí)現(xiàn)(例如庫(kù)函數(shù)),因此用戶只能瀏覽函數(shù)原型才知道可能會(huì)拋出哪些類型的異常。7.1.4異常處理的其它方面異常重拋或轉(zhuǎn)換
異常重拋(rethrow),是在catch塊中使用一個(gè)空throw語(yǔ)句來(lái)達(dá)到此目的,重拋后程序立刻退出當(dāng)前try/catch范圍而進(jìn)入上一層范圍,有可能是上一層調(diào)用者,也有可能是嵌套的try/catch結(jié)構(gòu)的上一級(jí)。也可以在catch塊內(nèi)拋出一個(gè)不同于當(dāng)前異常類型的異常對(duì)象,這樣可以實(shí)現(xiàn)異常轉(zhuǎn)換,并讓上層調(diào)用者來(lái)進(jìn)一步處理。7.2I/0流與文件—
流的概念
“流”取意于“水流”、“車流”中的流,表示一種位置的動(dòng)態(tài)變化。
數(shù)據(jù)從任一位置“流”動(dòng)到另一個(gè)位置都可表示為字節(jié)序列的“流”動(dòng)。
根據(jù)“流”的位置和傳輸特征,可分為文件流、I/O流、內(nèi)存流、網(wǎng)絡(luò)流以及加解密流等概念。C++流庫(kù)是C++為了完成輸入/輸出工作而定義的一套類的集合,這些類構(gòu)成一個(gè)層次系統(tǒng)。
7.2I/0流與文件—
流的概念
ios類(<ios.h>)及其類層次是最重要的內(nèi)容。ios類定義了用戶經(jīng)常使用的輸入輸出控制函數(shù)和一些有關(guān)格式控制、狀態(tài)檢測(cè)的枚舉常量。它們的分別定義如下的頭文件:<ios.h>、<istream.h>、<ostream.h>、<iostream.h>和<fstream.h>。
ios(I/O流)istream(輸入流)ostream(輸出流)iostream(輸入/輸出流)fstream(文件輸入/輸出流)ifstream(文件輸入流)ofstream(文件輸出流)7.2I/0流與文件—
流的概念C++的流庫(kù)預(yù)定義了4個(gè)流對(duì)象,它們是istream類對(duì)象cin(標(biāo)準(zhǔn)輸入流,默認(rèn)為鍵盤(pán)),ostream類對(duì)象cout(標(biāo)準(zhǔn)輸出流)、cerr(標(biāo)準(zhǔn)錯(cuò)誤流)、clog(標(biāo)準(zhǔn)日志流),這三個(gè)對(duì)象默認(rèn)的設(shè)備都是顯示終端。7.2.2C++中的文件輸入/輸出
(1)C++文件流類從ios類派生出文件輸入流類ifstream,文件輸出流類ofstream,文件輸入/輸出流fstream,分別用于文件的輸入、輸出操作。ofstream類:用來(lái)打開(kāi)(創(chuàng)建)文件、并執(zhí)行文件的輸出操作。
ifstream類:用來(lái)打開(kāi)文件,并執(zhí)行文件的輸入操作。
fstream類:它兼有ofstream和ifstream基本性質(zhì),可以打開(kāi)同時(shí)用于輸入和輸出的文件。
【例7-5】【例7-6】7.2.2C++中的文件輸入/輸出由上面的兩個(gè)例子,可得出看出對(duì)文件的操作過(guò)程如下:①根據(jù)文件的實(shí)際輸入輸出情況定義ifstream、ofstream、fstream類的對(duì)象;②調(diào)用對(duì)象的成員函數(shù)open()來(lái)打開(kāi)文件或通過(guò)構(gòu)造函數(shù)來(lái)直接打開(kāi)文件;③對(duì)文件進(jìn)行操作;④操作完畢后,用成員函數(shù)close()關(guān)閉文件。
7.2.2C++中的文件輸入/輸出對(duì)于三個(gè)文件流類,都有四個(gè)重載的構(gòu)造函數(shù),現(xiàn)闡述如下:其中最常用是:
ofstream(char*pFileName,intmode,int
prot);7.2.2C++中的文件輸入/輸出關(guān)于三個(gè)參數(shù)的解釋如下:
①
pFileName:文件名指針,要打開(kāi)(創(chuàng)建)的文件名保存在pFileName所指向的字符串中。②
mode:文件的打開(kāi)方式
名稱
描述ios::in
打開(kāi)一個(gè)可讀取文件,如果文件不存在創(chuàng)建文件ios::out
打開(kāi)一個(gè)可寫(xiě)入文件,如果文件不存在創(chuàng)建文件ios::app
寫(xiě)入的所有數(shù)據(jù)將被追加到文件的末尾,此方式使用ios::outios::ate
寫(xiě)入的所有數(shù)據(jù)將被追加到文件的末尾,此方式不使用ios::outios::trunk
打開(kāi)一個(gè)文件,如果文件已存在,刪除文件原來(lái)已存在的內(nèi)容。ios::nocreate
如果文件存在,則打開(kāi)該文件,否則將返回一個(gè)錯(cuò)誤。
ios::noreplace
如果文件不存在,創(chuàng)建并打開(kāi)該文件,否則將返回一個(gè)錯(cuò)誤。
ios::binary
以二進(jìn)制的形式打開(kāi)一個(gè)文件,缺省為文本文件。
7.2.2C++中的文件輸入/輸出關(guān)于三個(gè)參數(shù)的解釋如下:
③prot:文件的讀寫(xiě)權(quán)限
名稱
描述filebuf::openprot
兼容共享方式
filebuf::sh_none
獨(dú)占,不允許共享filebuf::sh_read
允許讀共享filebuf::sh_write
允許寫(xiě)共享【例7-7】7.2.2C++中的文件輸入/輸出函數(shù)seekg()將把定位到指定的位置??梢允褂茫?/p>
l
ios::beg:移動(dòng)到文件首端;l
ios::end:移動(dòng)到文件末端;
l
一個(gè)負(fù)整數(shù),如-5:定位到當(dāng)前位置的5個(gè)字符以前;l
一個(gè)正整數(shù),如5:向后跳過(guò)5個(gè)字符;l
帶兩個(gè)參數(shù),如(-5,ios::end):讀文件文本的最后4個(gè)字符,操作過(guò)程是到達(dá)了末尾(ios::end),接著到達(dá)了末尾的前五個(gè)字符的位置(-5)。
7.2.2C++中的文件輸入/輸出(2)文件的操作方式①
文件讀寫(xiě)函數(shù)l
get(char):從文件中讀取一個(gè)字節(jié);lgetline(char*pch,intcount,chardelim=’\n’):從文件中讀取count個(gè)字節(jié),delim為讀取時(shí)的結(jié)束符;l
read(char*pch,intcount):從文件中讀取count個(gè)字節(jié),常用于二進(jìn)制文件。l
put(charch):向文件寫(xiě)入一個(gè)字節(jié);l
write(constchar*pch,intcount):向文件寫(xiě)入count個(gè)字節(jié),常用于二進(jìn)制文件。7.2.2C++中的文件輸入/輸出(2)文件的操作方式文件檢測(cè)函數(shù)l
good():無(wú)錯(cuò)誤發(fā)生,返回非零;l
bad():流操作發(fā)生錯(cuò)誤,返回非零;l
fail():流操作發(fā)生錯(cuò)誤,返回非零。l
eof():數(shù)據(jù)流到達(dá)文件尾,返回真值非零;文件尾表示文件最一個(gè)字節(jié)的后面;l
is_open():檢測(cè)一個(gè)文件流對(duì)象是否關(guān)聯(lián)打開(kāi)某個(gè)文件,即檢測(cè)是否使用open函數(shù)和構(gòu)造函數(shù)打開(kāi)某個(gè)文件;返回非零為真;7.2.2C++中的文件輸入/輸出(3)二進(jìn)制的操作方式get()函數(shù)與put()函數(shù)具有讀/寫(xiě)二進(jìn)制格式文件的能力:讀取一個(gè)字節(jié),使用get()函數(shù);寫(xiě)入一個(gè)字節(jié),則使用put()函數(shù)。如果要讀/寫(xiě)一整塊的數(shù)據(jù),那么可以使用read()和write()函數(shù)?!纠?-8】
【例7-9】
7.2.2C++中的文件輸入/輸出(4)文件的隨機(jī)讀寫(xiě)
文件的隨機(jī)讀使用函數(shù)seekg(),隨機(jī)寫(xiě)使用函數(shù)seekp(),函數(shù)名中的g和p分別表示get與put,它們的原型是:istream&seekg(streamoffoffset,
seek_dirorigin);ostream&seekp(streamoffoffset,
seek_dirorigin);文件讀寫(xiě)指針的當(dāng)前位置可用以下函數(shù)確定:
streampos
tellg();//返回當(dāng)前讀指針的位置streampos
tellp();
//返回當(dāng)前寫(xiě)指針的位置
【例7-10】7.2.3格式化輸入與輸出對(duì)輸入流與輸出流進(jìn)行數(shù)據(jù)格式控制,有兩種方式:一種使用成員函數(shù);一種使用操縱符。
(1)用ios類的成員函數(shù)實(shí)現(xiàn)格式化
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年超市季節(jié)性促銷員勞動(dòng)合同3篇
- 二零二五版智能家居砌墻裝修承包合同范本2篇
- 二零二五版3海上貨物運(yùn)輸合同-海上貨物運(yùn)輸事故處理及賠償協(xié)議2篇
- 二零二五版綜合性博士后研究人員聘用合同書(shū)3篇
- 二零二五版物聯(lián)網(wǎng)技術(shù)培訓(xùn)服務(wù)合同樣本2篇
- 二零二五年度版權(quán)買賣合同(圖書(shū))5篇
- 二零二五版勞動(dòng)合同法下社保購(gòu)買期限及權(quán)益保障協(xié)議3篇
- 二零二五年度餐廳線上線下融合推廣承包合同2篇
- 二零二五年網(wǎng)絡(luò)廣告投放合同封面素材2篇
- 二零二五版電影IP授權(quán)與贊助合同3篇
- 稅前工資反算表模板
- 廣東省深圳市2023年中考英語(yǔ)試題(含答案與解析)
- MOOC 電工學(xué)(電氣工程學(xué)概論)-天津大學(xué) 中國(guó)大學(xué)慕課答案
- 2019級(jí)水電站動(dòng)力設(shè)備專業(yè)三年制人才培養(yǎng)方案
- 室內(nèi)裝飾裝修施工組織設(shè)計(jì)方案
- 洗浴中心活動(dòng)方案
- 送電線路工程施工流程及組織措施
- 肝素誘導(dǎo)的血小板減少癥培訓(xùn)課件
- 韓國(guó)文化特征課件
- 抖音認(rèn)證承諾函
- 清潔劑知識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論