第七講 異常處理與IO_第1頁
第七講 異常處理與IO_第2頁
第七講 異常處理與IO_第3頁
第七講 異常處理與IO_第4頁
第七講 異常處理與IO_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章異常處理與I/O流

王建興閩江學院物理學與電子信息工程系7.1異常處理

異常處理過程,就是預防運行時錯誤的發(fā)生,即在錯誤即將發(fā)生前通過檢測觸發(fā)它的條件來阻止它。C語言沒有內置的運行時錯誤處理機制,一般采用下列的方法來處理可能的運行時錯誤:①

函數返回統(tǒng)一定義的狀態(tài)編碼來表操作成功、失敗或其他錯誤信息。②

使用全局變量來保存錯誤編碼,每一個使用到它的函數在開始是時候都檢查它的值,并且每一個函數的結尾把狀態(tài)信息寫回到這個全局變量中。③

出錯時終止程序運行。7.1.1異常處理的語法結構

組成部分:拋出異常、提煉異常、捕獲異常以及異常類型

拋出異常

throw異常對象表達式;

throw語句的異常對象類型就是異常類型

7.1.1異常處理的語法結構

提煉異常和捕獲異常

try{復合語句

}catch(異常類型

[名稱]){復合語句

}catch(異常類型

[名稱]){復合語句

}……【例7-1】

7.1.1異常處理的語法結構從程序結果中可以看出,在異常發(fā)生時,會自動調用在try塊中從try到throw語句之間創(chuàng)建起來的局部對象的析構函數,從而正常的釋放內存空間。如果在try塊中局部對象是動態(tài)創(chuàng)建的,那么一般來說就需要在相應的catch塊中釋放內存空間,特別是catch塊中有調用程序終止的語句時。

示例代碼7.1.2異常的類型匹配規(guī)則

C++規(guī)定:當一個異常對象和catch子句參數類型符合下列條件時,匹配成功:如果catch子句參數的類型就是異常對象的類型或其引用;如果catch子句參數類型是異常對象所屬類型的public基類;如果catch子句參數類型為基類指針或引用,而異常對象為派生類指針或引用;catch子句參數類型為void*,而異常對象為任何類型的指針;catch子句為catch-all,即catch(…)。示例7.1.2異常的類型匹配規(guī)則在異常組合中,要合理安排異常處理的層次:一定要把派生異常捕獲放在基類異常捕獲的前面,否則派生類異常匹配永遠也不會執(zhí)行。如果實在無法判斷到底會有什么異常拋出,那就使用catch(void*)和catch(…),但是必須放在異常組合的最后面。

catch塊的參數應當采用引用傳遞而不是值傳遞。原因有二:一是異常對象可能會在調用鏈中上溯好幾個層次才能遇到匹配的處理塊,此時引用傳遞比值傳遞的效率高得多;二是可以利用異常對象的多態(tài)性,因為異常類型可能是多態(tài)類??梢話伋鲆粋€異常對象的地址,那么catch塊中的參數就是異?;愋偷闹羔?。7.1.4異常處理的其它方面

異常類型和異常對象

任何一種類型都可以當作異常類型,異常僅通過類型而不是通過對象的值來匹配的。

但是一般不使用基本數據類型的對象作為異常,因為它們表示異常的能力不足;相反,總是自定義一些異常類來具體描述我們需要的異常類型?!纠?-3】

7.1.4異常處理的其它方面

異常說明

異常說明是為了加強程序的可讀性。DoubleDevide(doublex,

doubley)throw(DevidedByZero);//表示拋出一種異常BoolF(constchar*)throw(T1,

T2,

T3);//表示可能有三種異常①能清楚地告訴函數的調用者,該函數可能會拋出什么異常,以便用戶能夠編寫正確的的異常處理結構。②用戶一般無法看到函數的實現(xiàn)(例如庫函數),因此用戶只能瀏覽函數原型才知道可能會拋出哪些類型的異常。7.1.4異常處理的其它方面異常重拋或轉換

異常重拋(rethrow),是在catch塊中使用一個空throw語句來達到此目的,重拋后程序立刻退出當前try/catch范圍而進入上一層范圍,有可能是上一層調用者,也有可能是嵌套的try/catch結構的上一級。也可以在catch塊內拋出一個不同于當前異常類型的異常對象,這樣可以實現(xiàn)異常轉換,并讓上層調用者來進一步處理。7.2I/0流與文件—

流的概念

“流”取意于“水流”、“車流”中的流,表示一種位置的動態(tài)變化。

數據從任一位置“流”動到另一個位置都可表示為字節(jié)序列的“流”動。

根據“流”的位置和傳輸特征,可分為文件流、I/O流、內存流、網絡流以及加解密流等概念。C++流庫是C++為了完成輸入/輸出工作而定義的一套類的集合,這些類構成一個層次系統(tǒng)。

7.2I/0流與文件—

流的概念

ios類(<ios.h>)及其類層次是最重要的內容。ios類定義了用戶經常使用的輸入輸出控制函數和一些有關格式控制、狀態(tài)檢測的枚舉常量。它們的分別定義如下的頭文件:<ios.h>、<istream.h>、<ostream.h>、<iostream.h>和<fstream.h>。

ios(I/O流)istream(輸入流)ostream(輸出流)iostream(輸入/輸出流)fstream(文件輸入/輸出流)ifstream(文件輸入流)ofstream(文件輸出流)7.2I/0流與文件—

流的概念C++的流庫預定義了4個流對象,它們是istream類對象cin(標準輸入流,默認為鍵盤),ostream類對象cout(標準輸出流)、cerr(標準錯誤流)、clog(標準日志流),這三個對象默認的設備都是顯示終端。7.2.2C++中的文件輸入/輸出

(1)C++文件流類從ios類派生出文件輸入流類ifstream,文件輸出流類ofstream,文件輸入/輸出流fstream,分別用于文件的輸入、輸出操作。ofstream類:用來打開(創(chuàng)建)文件、并執(zhí)行文件的輸出操作。

ifstream類:用來打開文件,并執(zhí)行文件的輸入操作。

fstream類:它兼有ofstream和ifstream基本性質,可以打開同時用于輸入和輸出的文件。

【例7-5】【例7-6】7.2.2C++中的文件輸入/輸出由上面的兩個例子,可得出看出對文件的操作過程如下:①根據文件的實際輸入輸出情況定義ifstream、ofstream、fstream類的對象;②調用對象的成員函數open()來打開文件或通過構造函數來直接打開文件;③對文件進行操作;④操作完畢后,用成員函數close()關閉文件。

7.2.2C++中的文件輸入/輸出對于三個文件流類,都有四個重載的構造函數,現(xiàn)闡述如下:其中最常用是:

ofstream(char*pFileName,intmode,int

prot);7.2.2C++中的文件輸入/輸出關于三個參數的解釋如下:

pFileName:文件名指針,要打開(創(chuàng)建)的文件名保存在pFileName所指向的字符串中。②

mode:文件的打開方式

名稱

描述ios::in

打開一個可讀取文件,如果文件不存在創(chuàng)建文件ios::out

打開一個可寫入文件,如果文件不存在創(chuàng)建文件ios::app

寫入的所有數據將被追加到文件的末尾,此方式使用ios::outios::ate

寫入的所有數據將被追加到文件的末尾,此方式不使用ios::outios::trunk

打開一個文件,如果文件已存在,刪除文件原來已存在的內容。ios::nocreate

如果文件存在,則打開該文件,否則將返回一個錯誤。

ios::noreplace

如果文件不存在,創(chuàng)建并打開該文件,否則將返回一個錯誤。

ios::binary

以二進制的形式打開一個文件,缺省為文本文件。

7.2.2C++中的文件輸入/輸出關于三個參數的解釋如下:

③prot:文件的讀寫權限

名稱

描述filebuf::openprot

兼容共享方式

filebuf::sh_none

獨占,不允許共享filebuf::sh_read

允許讀共享filebuf::sh_write

允許寫共享【例7-7】7.2.2C++中的文件輸入/輸出函數seekg()將把定位到指定的位置??梢允褂茫?/p>

l

ios::beg:移動到文件首端;l

ios::end:移動到文件末端;

l

一個負整數,如-5:定位到當前位置的5個字符以前;l

一個正整數,如5:向后跳過5個字符;l

帶兩個參數,如(-5,ios::end):讀文件文本的最后4個字符,操作過程是到達了末尾(ios::end),接著到達了末尾的前五個字符的位置(-5)。

7.2.2C++中的文件輸入/輸出(2)文件的操作方式①

文件讀寫函數l

get(char):從文件中讀取一個字節(jié);lgetline(char*pch,intcount,chardelim=’\n’):從文件中讀取count個字節(jié),delim為讀取時的結束符;l

read(char*pch,intcount):從文件中讀取count個字節(jié),常用于二進制文件。l

put(charch):向文件寫入一個字節(jié);l

write(constchar*pch,intcount):向文件寫入count個字節(jié),常用于二進制文件。7.2.2C++中的文件輸入/輸出(2)文件的操作方式文件檢測函數l

good():無錯誤發(fā)生,返回非零;l

bad():流操作發(fā)生錯誤,返回非零;l

fail():流操作發(fā)生錯誤,返回非零。l

eof():數據流到達文件尾,返回真值非零;文件尾表示文件最一個字節(jié)的后面;l

is_open():檢測一個文件流對象是否關聯(lián)打開某個文件,即檢測是否使用open函數和構造函數打開某個文件;返回非零為真;7.2.2C++中的文件輸入/輸出(3)二進制的操作方式get()函數與put()函數具有讀/寫二進制格式文件的能力:讀取一個字節(jié),使用get()函數;寫入一個字節(jié),則使用put()函數。如果要讀/寫一整塊的數據,那么可以使用read()和write()函數?!纠?-8】

【例7-9】

7.2.2C++中的文件輸入/輸出(4)文件的隨機讀寫

文件的隨機讀使用函數seekg(),隨機寫使用函數seekp(),函數名中的g和p分別表示get與put,它們的原型是:istream&seekg(streamoffoffset,

seek_dirorigin);ostream&seekp(streamoffoffset,

seek_dirorigin);文件讀寫指針的當前位置可用以下函數確定:

streampos

tellg();//返回當前讀指針的位置streampos

tellp();

//返回當前寫指針的位置

【例7-10】7.2.3格式化輸入與輸出對輸入流與輸出流進行數據格式控制,有兩種方式:一種使用成員函數;一種使用操縱符。

(1)用ios類的成員函數實現(xiàn)格式化

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論