




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1IO和異常處理2什么是異常處理異常處理就是處理程序中的錯誤3為什么需要異常處理1,一個庫的作者可以檢測出發(fā)生了運行時錯誤,但一般不知道怎樣去處理它們(因為和用戶具體的應用有關);2,庫的用戶知道怎樣處理這些錯誤,但卻無法檢查它們何時發(fā)生(如果能檢測,就可以再用戶的代碼里處理了,不用留給庫去發(fā)現)4異常處理的基本思想讓一個函數在發(fā)現了自己無法處理的錯誤時拋出(throw)一個異常,然后它的(直接或者間接)調用者能夠處理這個問題。也就是將問題檢測和問題處理相分離在所有支持異常處理的編程語言中,要認識到的一個思想:在異常處理過程中,由問題檢測代碼可以拋出一個對象給問題處理代碼,通過這個對象的類型和
2、內容,實際上完成了兩個部分的通信,通信的內容是“出現了什么錯誤”5C語言的異常處理在C語言中,對錯誤的處理有兩種方法:一是使用整型的返回值標識錯誤;二是使用errno宏(可以簡單的理解為一個全局整型變量)去記錄錯誤。C+中仍然可以用這兩種方法缺陷: 出現不一致問題。例如有些函數返回1表示成功,返回0表示出錯;而有些函數返回0表示成功,返回非0表示出錯。 函數的返回值只有一個。你通過函數的返回值表示錯誤代碼,那么函數就不能返回其他的值。當然,你也可以通過指針或者C+的引用來返回另外的值,但是這樣可能會令你的程序略微晦澀難懂(可能你對指針的運用不是很厲害)6使用異常處理的優(yōu)點函數的返回值可以忽略,
3、但異常不可忽略。如果程序出現異常,但是沒有被捕獲,程序就會終止,這多少會促使程序員開發(fā)出來的程序更健壯一點。而如果使用C語言的error宏或者函數返回值,調用者都有可能忘記檢查,從而沒有對錯誤進行處理,結果造成程序莫名其面的終止或出現錯誤的結果整型返回值沒有任何語義信息。而異常卻包含語義信息,有時從類名就能夠體現出來。整型返回值缺乏相關的上下文信息。異常作為一個類,可以擁有自己的成員,這些成員就可以傳遞足夠的信息。異常處理可以在調用跳級。假設在有多個函數的調用棧中出現了某個錯誤,使用整型返回碼要求你在每一級函數中都要進行處理。而使用異常處理的棧展開機制,只需要在一處進行處理就可以了,不需要每級
4、函數都處理7異常的語法try 可能會拋出異常的語句塊 throw 異常;catch(datatype_1) /異常處理catch(datatype_2).catch(datatype_i)catch(.) /除了上述異常的其它異常的處理8異常處理實例except1.cppexcept2.cppNestedExceptionHandle.cpp9異常處理順序ExceptHandleOrder.cpp10異常處理void ExceptFunc(arg) throw(Except1,Except2,.)對拋出的異常類型進行說明void ExceptionFunction(argument) thro
5、w()沒有任何異常拋出void ExceptionFunction(argument)可能拋出任何一種異常,也可能沒有異常,意義是最廣泛的11異常處理注意事項(1)try和catch塊中必須要用花括號括起來,即使花括號內只有一個語句也不能省略花括號;(2)try和catch必須成對出現,一個try_catch結果中只能有一個try塊,但可以有多個catch塊,以便與不同的異常信息匹配;(3)如果在catch塊中沒有指定異常信息的類型,而用刪節(jié)號.,則表示它可以捕獲任何類型的異常信息;(4)如果throw不包括任何表達式,表示它把當前正在處理的異常信息再次拋出,傳給其上一層的catch來處理;(
6、5)C+中一旦拋出一個異常,如果程序沒有任何的捕獲,那么系統(tǒng)將會自動調用一個系統(tǒng)函數terminate,由它調用abort終止程序12標準異常13最頂層基類是exception,提供了what()虛函數用來描述錯誤14151617IO和異常處理18IO和異常處理19IO流ostream的常規(guī)操作istream的常規(guī)操作文件的基本操作流程文件的其他操作2021cin-標準的輸入cout -標準的輸出cerr-標準的錯誤輸出(不帶緩沖)clog-標準的錯誤輸出(緩沖的)外部聲明 在 namespace std 中 /usr/include/c+/4.6/iostreamcerr與cout的區(qū)別 同
7、樣都是輸出數據,但是在集成開發(fā)工具 下(eclipse)cerr輸出內容的顏色是紅色的 輸出設備可能不同IO的全局對象22int i = 10;int i = 10;cout i = i endl;cout i = i i;cin i; 鍵入鍵值鍵入鍵值 int i int i 存放存放 int i int i 顯示顯示 | | | | | | 鍵盤鍵盤-內存內存-終端終端 | | | | 輸入過程輸入過程 輸出過程輸出過程 輸入和輸出的過程輸入和輸出的過程23IO分類設備IO 屏幕/鍵盤文件IO 文件字符串IO 字符串2425ostream流類對應每個基本數據類型都有友元,它們在iostre
8、am中聲明:流原理流原理cout是ostream流類的對象,在iostream 頭文件中定義:ostream cout(stdout); ; /標準設備名作為其構造時的參數標準設備名作為其構造時的參數ostream& operator(ostream& dest, ,char* pSource); ;ostream& operator(ostream& dest, ,int source); ;ostream& operator(ostream& dest, ,char source); ;/.27分析語句cout“My name is Jone
9、”;ostream& operator(ostream& dest, ,char* pSource); ;cout this is 7;ostream& operator(istream& dest, ,char* pSource); ;istream& operator(istream& dest, ,int source); ;istream& operator(istream& dest, ,char source); ;.29ostream 成員函數operator 輸出運算符函數:可以連續(xù)的輸出put(char ch)
10、輸出單個字符width(int) 設置輸出默認寬度fill(#) 按width()設定的寬度,填充空位的字符precision(int) 設置有效位數30setf(flag)/unsetf(flag) 設置/取消輸出控制標志常見的輸出flag有 ios:left 靠左對齊 ios:right 靠右對齊(默認) ios:dec 10進制(默認) ios:oct 8進制 ios:hex 16進制 ios:showbase 帶前綴 ios:showpoint 帶小數點 ios:uppercase 大寫 ios:showpos 帶符號 ios:scientific 科學計數法31int n;cout
11、n;cout n in hexadecimal is: hex n n dec n in octal is: oct n n setbase(10) n in decimal is: n endl;整數通常被解釋為十進制(基數為10)整數使用hex,dec,oct,setbase()可改變基數必須在程序中包含頭文件iomanip32設置浮點數精度(precision、setprecision)設置了精度以后,該精度對之后所有的輸出操作都有效,直到下一次設置精度為止無參數的成員函數percision返回當前設置的精度 for ( places = 0; places = 9; places+ )
12、 cout.precision( places ); cout root2 n; for ( places = 0; places = 9; places+ ) cout setprecision( places ) root2 n;33設置域寬(setw(uint)、width(uint) 成員函數ios.width設置當前的域寬(即輸入輸出的字符數)并返回以前設置的域寬。如果顯示數據所需的寬度比設置的域寬小,空位用填充字符填充。如果顯示數據所需的寬度比設置的域寬大,顯示數據并不會被截斷,系統(tǒng)會輸出所有位。域寬設置僅對下一行流讀取或流插入操作有效,在一次操作完成之后,城寬又被置回034 in
13、t main() int w = 4; char string 10 ; cout string ) cout.width( w+ ); cout string endl; cin.width( 5 ); return 0; 35#include using namespace std;int main() double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout valuesi n; 36用戶自定義的流操縱#include ostream& tab( ostream& o
14、utput ) return output t; cout a tabbtabc : 輸入運算符函數char get(char) 輸入單個字符getline():獲取一行。遇到換行字符結束 全局函數:getline(istream &,string); 成員函數:getline(char *,int limit);char peek():peek 瞥一眼 當輸入緩沖區(qū)中沒有數據的時候,等待用戶輸入, 返回輸入緩沖區(qū)中第一個字符39bool bad() 讀寫的過程中出錯,返回truebool fail() 讀寫的過程出錯,或者格式讀取錯誤也會返回truebool eof() 讀文件到末尾
15、時,返回truebool good() 文件讀寫正常返回true在系統(tǒng)中流壞掉了主要不是真正不能使用了,而是將監(jiān)控流狀態(tài)的的標志量設置成了false若想重置以上成員函數檢查的狀態(tài)標志,可以使用clear( ) 函數驗證流狀態(tài)40注意點: (1) peek() / ignore() 會等待用戶輸入鍵值 這些鍵值包含空格。 (2)處理字符串輸入問題一般使用全局的 getline()。 (3)get()只能獲得字符,其他數據類型不能獲得。putback(char a):放回函數 將一個字符放回到緩沖區(qū)中ignore(int len,char ch):忽略函數 忽略len個字符,ch是結束標志41緩沖
16、區(qū)cin / cout 都是帶緩沖區(qū)的cin 會檢查輸入緩沖區(qū)中是否有數據存在,當沒有數據的時候,就等待用戶從鍵盤輸入,然后再到輸入緩沖區(qū)中取數據;當有數據的時候,直接將取到的數據存放到內存中cin i; 并不是直接將鍵盤輸入的值存放在內存中的 鍵盤 -緩沖區(qū)-內存42數組越界數組越界 數組越界的后果數組越界的后果 (1)cin 直接報直接報 棧溢出棧溢出 (2)cin.getline() 會影響后面的輸入會影響后面的輸入43操作文件的3大類ofstream 寫文件類 將數據輸出到文件上ifstream 讀文件類 將文件數據存放在內存中fstream 讀寫文件類使用上述3大類: 必須#incl
17、ude 44文件的打開利用構造函數打開文件ifstream file(const char * pFilePath, openMode)默認以輸入方式打開文件ofstream file(const char * pFilePath, openMode)默認以輸出方式打開文件fstream file(const char * pFilePath, openMode)以輸入輸出方式打開文件45ios:app 追加模式打開文件追加模式打開文件ios:ate 打開并找到文件尾ios:binary 二進制方式打開文件二進制方式打開文件ios:in 輸入(讀)模式打開文件輸入(讀)模式打開文件ios:ou
18、t 輸出(寫)模式打開文件輸出(寫)模式打開文件ios:trunc 若文件已經存在則清空文件的模式打開文件若文件已經存在則清空文件的模式打開文件用位域操作符用位域操作符 | | 組合這些標志組合這些標志46實例向現有文件中添加二進制數據ofstream logfile(login.dat, ios:binary | ios:app);讀、寫、將文件設定為空fstream test(hahahah,ios:in | ios:out | ios:trunc); 47文件的打開利用open()函數打開文件ofstream ofile;ofstream ofile;ofile.open(const c
19、har *filename, openmode)判斷文件的打開:判斷文件的打開: (1) (1)對象對象 (2)is_open()(2)is_open()48當文件的讀寫操作完成之后,我們必須將文件關閉以使文件重當文件的讀寫操作完成之后,我們必須將文件關閉以使文件重新變?yōu)榭稍L問的。關閉文件時需要調用成員函數新變?yōu)榭稍L問的。關閉文件時需要調用成員函數close( ),close( ),它負它負責將緩存中的數據排放出來并關閉文件。責將緩存中的數據排放出來并關閉文件。這個函數一旦被調用,原來的流對象就可以被用來打開其他的這個函數一旦被調用,原來的流對象就可以被用來打開其他的文件了,這個文件也可以重新
20、被其他的進程訪問了。文件了,這個文件也可以重新被其他的進程訪問了。文件的關閉49fstream file;file.open(“example”, ios:out | ios:app | ios:binary);if(file !=NULL) cout“open failed”endl;/. 文件操作文件操作file.close();50文件輸出文件輸出(寫文件)方式一:使用 “ ” 運算符由于由于ofstream 由由 ostream 引申而來,所以可以同引申而來,所以可以同cout 一樣使用一樣使用 “ 插入操作符插入操作符ofstream ofile(“example”);if( !of
21、ile.is_open() ) cout“open failed”endl;return;ofile“pear”“ “4.5endl;ofile.close();51文件輸出(寫文件)方式二:二進制文件的輸出使用使用write 成員函數可以對文件進行二進制的輸成員函數可以對文件進行二進制的輸出,打開文件時,指定二進制打開模式出,打開文件時,指定二進制打開模式文件輸出ofstream ofile(“example”, ios:out | ios:binary);if( !ofile.is_open() ) cout“open failed”szText;ofile.write(szText, s
22、izeof(szText);ofile.close();52文件輸入文件輸入(讀文件)方式一:使用“ “ 運算符由于由于ifstream 由由 istream 引申而來,所以可引申而來,所以可以同以同cin 一樣使用一樣使用 “ 插入操作符插入操作符ifstream ifile(“example”);if( !ifile.is_open() ) cout“open failed”szTextprice;cout“ the file content is:”szText“ “priceendl;ifile.close();53文件輸入文件輸入(讀文件)方式二:二進制文件的讀取使用使用read 成
23、員函數可以對文件進行二進制的輸入,成員函數可以對文件進行二進制的輸入,打開文件時,指定二進制打開模式打開文件時,指定二進制打開模式ifstream ifile(“example”, ios:in | ios:binary);if( !ifile.is_open() ) cout“open failed”endl;return;char szText10= 0 ;ifile.read(szText, sizeof(szText); /讀讀取格式與寫入格式要取格式與寫入格式要對對應應cout“ the file content is:”szTextendl;ifile.close();54bool
24、 bad() 讀寫的過程中出錯,返回truebool fail() 讀寫的過程出錯,或者格式讀取錯誤也會返回truebool eof() 讀文件到末尾時,返回truebool good() 文件讀寫正常返回true在系統(tǒng)中流壞掉了主要不是真正不能使用了,而是將監(jiān)控流狀態(tài)的的標志量設置成了false若想重置以上成員函數檢查的狀態(tài)標志,可以使用clear( ) 函數驗證流狀態(tài)55文件指針流指針的設置流指針的設置 所有的輸入/輸出流對象都至少有一個流指針:ifstream:有一個:有一個get pointer指針,指向下一個被指針,指向下一個被讀取的元素讀取的元素ofstream:有一個:有一個pu
25、t pointer指針,指向寫入下一指針,指向寫入下一個元素的位置個元素的位置fstream:同時繼承了:同時繼承了get 和和 put 指針指針56流指針相關函數tellg( )和和 tellp( )返回一個返回一個pos_type類型,即整數,分別代表當前讀指針類型,即整數,分別代表當前讀指針(get) 和和 寫指針寫指針(put) 的位置的位置seekg( pos_type position ) 和和 seekp( pos_type position )流指針被改變?yōu)橹赶蛭募_始計算的一個絕對位置,傳流指針被改變?yōu)橹赶蛭募_始計算的一個絕對位置,傳入的參數類型與函數入的參數類型與函數te
26、llg 和和 tellp 的返回值類型相同的返回值類型相同seekg( offset, seekdir) 和和 seekp( offset, seekdir)從由參數從由參數seekdir 設定的位置開始計算一個位移設定的位置開始計算一個位移 offset,其中其中seekdir的值可以是:的值可以是: ios:beg(流開始的位置),流開始的位置),ios:cur(流當前的位置),流當前的位置),ios:end(流末尾的位置)流末尾的位置)57externextern “ C ” extern 是是c/c+ 語言中表明函數或全局變量作用范圍的關語言中表明函數或全局變量作用范圍的關鍵字,該關鍵
27、字告訴編譯器此,其聲明的函數和變量可以鍵字,該關鍵字告訴編譯器此,其聲明的函數和變量可以在本模塊或其他模塊中使用在本模塊或其他模塊中使用在在c+的環(huán)境下使用的環(huán)境下使用c 的函數時,通常會出現編譯器無的函數時,通常會出現編譯器無法找到法找到 obj 模塊中的模塊中的c 函數定義的問題,從而導致鏈接失敗函數定義的問題,從而導致鏈接失敗。這是因為在。這是因為在c+ 中支持函數重載,編譯時會將函數名和中支持函數重載,編譯時會將函數名和參數列表連接起來參數列表連接起來,而,而c 語言不會,因此會造成鏈接失敗的語言不會,因此會造成鏈接失敗的情況,此時情況,此時 c 函數就需要使用函數就需要使用extern “C “ 來進行鏈接指定來進行鏈接指定。58extern “ C ”C+ 中引用C 語言的函數/ / 在包含在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 虛擬財產轉讓合同協議
- 蔬菜每日供貨協議書范本
- 藥品退換貨協議合同
- 英文傭金協議書范本
- 解除代言合同協議書范本
- 紡織品新材料探索與應用試題及答案
- 氣象氣候考試試題及答案
- 機械設計b試題及答案
- 頻繁練習2024國際商業(yè)美術設計師試題及答案
- 分解組成試題講解及答案
- 酒水購銷合同范本(3篇)
- ??低曄到y(tǒng)圖標
- 三年級語文下冊第七單元(集體備課)教材分析說課稿課件
- 印染廠管理手冊
- 保潔服務崗位檢查考核評分標準
- 《字體與版式設計》教學課件(全)
- 四川大學年《系統(tǒng)解剖學》期末試題及答案
- 幼兒園繪本:《小蛇散步》 課件
- 博德之門BG+TOSC細節(jié)攻略
- 正畸沙龍專用宣教PPT-口腔正畸正當時
- 計算機網絡故障的診斷與解決方法論文
評論
0/150
提交評論