




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1IO和特殊處理2什么是特殊處理特殊處理就是處理程序中的錯(cuò)誤3為什么需要特殊處理1,一個(gè)庫的作者可以檢測(cè)動(dòng)身生了運(yùn)行時(shí)錯(cuò)誤,但一般不知道怎樣去處理它們〔由于和用戶具體的應(yīng)用有關(guān)〕;2,庫的用戶知道怎樣處理這些錯(cuò)誤,但卻無法檢查它們何時(shí)發(fā)生〔假設(shè)能檢測(cè),就可以再用戶的代碼里處理了,不用留給庫去覺察〕4特殊處理的根本思想讓一個(gè)函數(shù)在覺察了自己無法處理的錯(cuò)誤時(shí)拋出〔throw〕一個(gè)特殊,然后它的〔直接或者間接〕調(diào)用者能夠處理這個(gè)問題。也就是將問題檢測(cè)和問題處理相分別在全部支持特殊處理的編程語言中,要生疏到的一個(gè)思想:在特殊處理過程中,由問題檢測(cè)代碼可以拋出一個(gè)對(duì)象給問題處理代碼,通過這個(gè)對(duì)象的類型和內(nèi)容,實(shí)際上完成了兩個(gè)局部的通信,通信的內(nèi)容是“消逝了什么錯(cuò)誤”5C語言的特殊處理在C語言中,對(duì)錯(cuò)誤的處理有兩種方法:一是使用整型的返回值標(biāo)識(shí)錯(cuò)誤;二是使用errno宏〔可以簡(jiǎn)潔的理解為一個(gè)全局整型變量〕去記錄錯(cuò)誤。C++中照舊可以用這兩種方法缺陷:消逝不全都問題。例如有些函數(shù)返回1表示成功,返回0表示出錯(cuò);而有些函數(shù)返回0表示成功,返回非0表示出錯(cuò)。函數(shù)的返回值只有一個(gè)。你通過函數(shù)的返回值表示錯(cuò)誤代碼,那么函數(shù)就不能返回其他的值。固然,你也可以通過指針或者C++的引用來返回另外的值,但是這樣可能會(huì)令你的程序略微晦澀難懂〔可能你對(duì)指針的運(yùn)用不是很厲害〕6使用特殊處理的優(yōu)點(diǎn)函數(shù)的返回值可以無視,但特殊不行無視。假設(shè)程序消逝特殊,但是沒有被捕獲,程序就會(huì)終止,這多少會(huì)促使程序員開發(fā)出來的程序更強(qiáng)健一點(diǎn)。而假設(shè)使用C語言的error宏或者函數(shù)返回值,調(diào)用者都有可能遺忘檢查,從而沒有對(duì)錯(cuò)誤進(jìn)展處理,結(jié)果造成程序莫名其面的終止或消逝錯(cuò)誤的結(jié)果整型返回值沒有任何語義信息。而特殊卻包含語義信息,有時(shí)從類名就能夠表達(dá)出來。整型返回值缺乏相關(guān)的上下文信息。特殊作為一個(gè)類,可以擁有自己的成員,這些成員就可以傳遞足夠的信息。特殊處理可以在調(diào)用跳級(jí)。假設(shè)在有多個(gè)函數(shù)的調(diào)用棧中消逝了某個(gè)錯(cuò)誤,使用整型返回碼要求你在每一級(jí)函數(shù)中都要進(jìn)展處理。而使用特殊處理的棧開放機(jī)制,只需要在一處進(jìn)展處理就可以了,不需要每級(jí)函數(shù)都處理7特殊的語法try{可能會(huì)拋出特殊的語句塊throw特殊;}catch(datatype_1)//特殊處理{}catch(datatype_2){}...catch(datatype_i){}catch(...)//除了上述特殊的其它特殊的處理{}8特殊處理實(shí)例except1.cppexcept2.cppNestedExceptionHandle.cpp9特殊處理挨次ExceptHandleOrder.cpp10特殊處理voidExceptFunc(arg…)throw(Except1,Except2,….)對(duì)拋出的特殊類型進(jìn)展說明voidExceptionFunction(argument…)throw沒有任何特殊拋出voidExceptionFunction(argument…)可能拋出任何一種特殊,也可能沒有特殊,意義是最廣泛的11特殊處理留意事項(xiàng)(1)try和catch塊中必需要用花括號(hào)括起來,即使花括號(hào)內(nèi)只有一個(gè)語句也不能省略花括號(hào);(2)try和catch必需成對(duì)消逝,一個(gè)try_catch結(jié)果中只能有一個(gè)try塊,但可以有多個(gè)catch塊,以便與不同的特殊信息匹配;(3)假設(shè)在catch塊中沒有指定特殊信息的類型,而用刪節(jié)號(hào)“...“,則表示它可以捕獲任何類型的特殊信息;(4)假設(shè)throw不包括任何表達(dá)式,表示它把當(dāng)前正在處理的特殊信息再次拋出,傳給其上一層的catch來處理;(5)C++中一旦拋出一個(gè)特殊,假設(shè)程序沒有任何的捕獲,那么系統(tǒng)將會(huì)自動(dòng)調(diào)用一個(gè)系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序12標(biāo)準(zhǔn)特殊13最頂層基類是exception,供給了what虛函數(shù)用來描述錯(cuò)誤14151617IO和特殊處理18IO和特殊處理19IO流ostream的常規(guī)操作istream的常規(guī)操作文件的根本操作流程文件的其他操作2021cin ------ 標(biāo)準(zhǔn)的輸入cout ------ 標(biāo)準(zhǔn)的輸出cerr ------ 標(biāo)準(zhǔn)的錯(cuò)誤輸出(不帶緩沖)clog ------ 標(biāo)準(zhǔn)的錯(cuò)誤輸出(緩沖的)外部聲明在namespacestd中/usr/include/c++/4.6/iostreamcerr與cout的區(qū)分同樣都是輸出數(shù)據(jù),但是在集成開發(fā)工具下(eclipse)cerr輸出內(nèi)容的顏色是紅色的輸出設(shè)備可能不同IO的全局對(duì)象22inti=10;cout<<“i=“<<i<<endl;cin>>i;鍵入鍵值inti存放 inti顯示| | |鍵盤-------->內(nèi)存--------->終端| |輸入過程 輸出過程輸入和輸出的過程23IO分類設(shè)備IO 屏幕/鍵盤文件IO 文件字符串IO 字符串2425ostream流類對(duì)應(yīng)每個(gè)根本數(shù)據(jù)類型都有友元,它們?cè)趇ostream中聲明:流原理cout是ostream流類的對(duì)象,在iostream頭文件中定義:ostreamcout(stdout);
//標(biāo)準(zhǔn)設(shè)備名作為其構(gòu)造時(shí)的參數(shù)
ostream&operator<<(ostream&dest,char*pSource);ostream&operator<<(ostream&dest,intsource);ostream&operator<<(ostream&dest,charsource);//..27分析語句cout<<“MynameisJone”;ostream&operator<<(ostream&dest,char*pSource);cout<<“thisis“<<7;ostream&operator<<(ostream&dest,intsource);28cin是istream的全局對(duì)象,istream流類也有假設(shè)干個(gè)友元:istream&operator>>(istream&dest,char*pSource);
istream&operator>>(istream&dest,intsource);
istream&operator>>(istream&dest,charsource);
...29ostream成員函數(shù)operator<<輸出運(yùn)算符函數(shù):可以連續(xù)的輸出put(charch)輸出單個(gè)字符width(int)設(shè)置輸出默認(rèn)寬度fill(‘#’)按width設(shè)定的寬度,填充空位的字符precision(int)設(shè)置有效位數(shù)30setf(flag)/unsetf(flag)設(shè)置/取消輸出把握標(biāo)志常見的輸出flag有ios::left 靠左對(duì)齊ios::right 靠右對(duì)齊〔默認(rèn)〕ios::dec 10進(jìn)制〔默認(rèn)〕ios::oct 8進(jìn)制ios::hex 16進(jìn)制ios::showbase帶前綴ios::showpoint帶小數(shù)點(diǎn)ios::uppercase大寫ios::showpos帶符號(hào)ios::scientific科學(xué)計(jì)數(shù)法31intn;cout<<“Enteradecimalnumber:“;cin>>n;cout<<n<<“inhexadecimalis:“<<hex<<n<<”\n”<<dec<<n<<“inoctalis:“<<oct<<n<<”\n” <<setbase(10)<<n<<“indecimalis:“ <<n<<endl;
整數(shù)通常被解釋為十進(jìn)制(基數(shù)為10)整數(shù)使用hex,dec,oct,setbase可轉(zhuǎn)變基數(shù)必需在程序中包含頭文件iomanip32設(shè)置浮點(diǎn)數(shù)精度(precision、setprecision)設(shè)置了精度以后,該精度對(duì)之后全部的輸出操作都有效,直到下一次設(shè)置精度為止無參數(shù)的成員函數(shù)percision返回當(dāng)前設(shè)置的精度for(places=0;places<=9;places++){
cout.precision(places);
cout<<root2<<”\n”;
}
for(places=0;places<=9;places++)
cout<<setprecision(places)<<root2<<”\n”;33設(shè)置域?qū)?setw(uint)、width(uint))成員函數(shù)ios.width設(shè)置當(dāng)前的域?qū)?即輸入輸出的字符數(shù))并返回以前設(shè)置的域?qū)?。假設(shè)顯示數(shù)據(jù)所需的寬度比設(shè)置的域?qū)捫?,空位用填充字符填充。假設(shè)顯示數(shù)據(jù)所需的寬度比設(shè)置的域?qū)挻?顯示數(shù)據(jù)并不會(huì)被截?cái)?,系統(tǒng)會(huì)輸出全部位。域?qū)捲O(shè)置僅對(duì)下一行流讀取或流插入操作有效,在一次操作完成之后,城寬又被置回034intmain
{
intw=4;charstring[10];cout<<“Enterasentence:\n“;cin.width(5);//設(shè)置輸入寬度while(cin>>string){ cout.width(w++); cout<<string<<endl; cin.width(5);}return0;}
35#include<iostream>usingnamespacestd;intmain{doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i<4;i++){cout.width(10);cout<<values[i]<<”\n”;}}36用戶自定義的流操縱#include<iostream>ostream&tab(ostream&output){ returnoutput<<”\t”;}cout<<”a”<<tab<<”b”<<tab<<”c”<<endl;37
練習(xí)
* *** *************
圖形一金字塔********* 圖形二倒影38istream成員函數(shù)>>:輸入運(yùn)算符函數(shù)charget(char) 輸入單個(gè)字符getline:獵取一行。遇到換行字符完畢全局函數(shù):getline(istream&,string);成員函數(shù):getline(char*,intlimit);charpeek:peek瞥一眼當(dāng)輸入緩沖區(qū)中沒有數(shù)據(jù)的時(shí)候,等待用戶輸入,返回輸入緩沖區(qū)中第一個(gè)字符39boolbad讀寫的過程中出錯(cuò),返回trueboolfail讀寫的過程出錯(cuò),或者格式讀取錯(cuò)誤也會(huì)返回truebooleof讀文件到末尾時(shí),返回trueboolgood文件讀寫正常返回true在系統(tǒng)中流壞掉了主要不是真正不能使用了,而是將監(jiān)控流狀態(tài)的的標(biāo)志量設(shè)置成了false假設(shè)想重置以上成員函數(shù)檢查的狀態(tài)標(biāo)志,可以使用clear()函數(shù)驗(yàn)證流狀態(tài)40留意點(diǎn):(1)peek/ignore會(huì)等待用戶輸入鍵值這些鍵值包含空格。(2)處理字符串輸入問題一般使用全局的getline。(3)get只能獲得字符,其他數(shù)據(jù)類型不能獲得。putback(chara):放回函數(shù)將一個(gè)字符放回到緩沖區(qū)中ignore(intlen,charch):無視函數(shù)無視len個(gè)字符,ch是完畢標(biāo)志41緩沖區(qū)cin/cout都是帶緩沖區(qū)的cin>>會(huì)檢查輸入緩沖區(qū)中是否有數(shù)據(jù)存在,當(dāng)沒有數(shù)據(jù)的時(shí)候,就等待用戶從鍵盤輸入,然后再到輸入緩沖區(qū)中取數(shù)據(jù);當(dāng)有數(shù)據(jù)的時(shí)候,直接將取到的數(shù)據(jù)存放到內(nèi)存中cin>>i;并不是直接將鍵盤輸入的值存放在內(nèi)存中的鍵盤-------->緩沖區(qū)------->內(nèi)存42數(shù)組越界數(shù)組越界的后果(1)cin>>直接報(bào)棧溢出(2)cin.getline會(huì)影響后面的輸入43操作文件的3大類ofstream寫文件類將數(shù)據(jù)輸出到文件上ifstream讀文件類將文件數(shù)據(jù)存放在內(nèi)存中fstream 讀寫文件類使用上述3大類:必需#include<fstream>44文件的翻開利用構(gòu)造函數(shù)翻開文件ifstreamfile(constchar*pFilePath,openMode)默認(rèn)以輸入方式翻開文件ofstreamfile(constchar*pFilePath,openMode)默認(rèn)以輸出方式翻開文件fstreamfile(constchar*pFilePath,openMode)以輸入輸出方式翻開文件45ios::app追加模式翻開文件ios::ate翻開并找到文件尾ios::binary二進(jìn)制方式翻開文件ios::in輸入〔讀〕模式翻開文件ios::out輸出〔寫〕模式翻開文件ios::trunc假設(shè)文件已經(jīng)存在則清空文件的模式翻開文件用位域操作符|組合這些標(biāo)志46實(shí)例向現(xiàn)有文件中添加二進(jìn)制數(shù)據(jù)ofstreamlogfile(“l(fā)ogin.dat“,ios::binary|ios::app);讀、寫、將文件設(shè)定為空fstreamtest(“hahahah“,ios::in|ios::out|ios::trunc);47文件的翻開利用open函數(shù)翻開文件ofstreamofile;ofile.open(constchar*filename,openmode)推斷文件的翻開:(1)對(duì)象(2)is_open48 當(dāng)文件的讀寫操作完成之后,我們必需將文件關(guān)閉以使文件重新變?yōu)榭稍L問的。關(guān)閉文件時(shí)需要調(diào)用成員函數(shù)close(),它負(fù)責(zé)將緩存中的數(shù)據(jù)排放出來并關(guān)閉文件。 這個(gè)函數(shù)一旦被調(diào)用,原來的流對(duì)象就可以被用來翻開其他的文件了,這個(gè)文件也可以重新被其他的進(jìn)程訪問了。文件的關(guān)閉49fstreamfile;file.open(“example”,ios::out|ios::app|ios::binary);if(file!=NULL){ cout<<“openfailed”<<endl;}//…….文件操作file.close;50文件輸出文件輸出〔寫文件〕方式一:使用“<<”運(yùn)算符 由于ofstream由ostream引申而來,所以可以同cout一樣使用“<<“插入操作符ofstreamofile(“example”);if(!ofile.is_open){ cout<<“openfailed”<<endl; return;}ofile<<“pear”<<““<<4.5<<endl;ofile.close;51文件輸出〔寫文件〕方式二:二進(jìn)制文件的輸出 使用write成員函數(shù)可以對(duì)文件進(jìn)展二進(jìn)制的輸出,翻開文件時(shí),指定二進(jìn)制翻開模式文件輸出ofstreamofile(“example”,ios::out|ios::binary);if(!ofile.is_open){ cout<<“openfailed”<<endl; return;}charszText[10]={0};cin>>szText;ofile.write(szText,sizeof(szText));ofile.close;52文件輸入文件輸入〔讀文件〕方式一:使用“>>“運(yùn)算符 由于ifstream由istream引申而來,所以可以同cin一樣使用“>>“插入操作符ifstreamifile(“example”);if(!ifile.is_open){ cout<<“openfailed”<<endl; return;}charszText[10]={0};doubleprice=0;ifile>>szText>>price;cout<<“thefilecontentis:”<<szText<<““<<price<<endl;ifile.close;53文件輸入文件輸入〔讀文件〕方式二:二進(jìn)制文件的讀取 使用read成員函數(shù)可以對(duì)文件進(jìn)展二進(jìn)制的輸入,翻開文件時(shí),指定二進(jìn)制翻開模式ifstreamifile(“example”,ios::in|ios::binary);if(!ifile.is_open){ cout<<“openfailed”<<endl; return;}charszText[10]={0};ifile.read(szText,sizeof(szText));//讀取格式與寫入格式要對(duì)應(yīng)cout<<“thefilecontentis:”<<szText<<endl;ifile.close;54boolbad讀寫的過程中出錯(cuò),返回trueboolfail讀寫的過程出錯(cuò),或者格式讀取錯(cuò)誤也會(huì)返回truebooleof讀文件到末尾時(shí),返回trueboolgood文件讀寫正常返回true在系統(tǒng)中流壞掉了主要不是真正不能使用了,而是將監(jiān)控流狀態(tài)的的標(biāo)志量設(shè)置成了false假設(shè)想重置以上成員函數(shù)檢查的狀態(tài)標(biāo)志,可以使用clear()函數(shù)驗(yàn)證流狀態(tài)55文件指針流指針的設(shè)置全部的輸入/輸出流對(duì)象都至少有一個(gè)流指針: ifstream:有一個(gè)getpointer指針,指向下一個(gè)被讀取的元素 ofstream:有一個(gè)putpointer指針,指向?qū)懭胂乱粋€(gè)元素的位置 fstream:同時(shí)繼承了get和put指針56流指針相關(guān)函數(shù)tellg()和tellp() 返回一個(gè)pos_type類型,即整數(shù),分別代表當(dāng)前讀指針(get)和寫指針(put)的位置seekg(pos_typeposition)和seekp(pos_typeposition) 流指針被轉(zhuǎn)變?yōu)橹赶蛭募_頭計(jì)算的一個(gè)確定位置,傳入的參數(shù)類型與函數(shù)tellg和tellp的返回值類型一樣seekg(offset,seekdir)和seekp(offset,seekdir) 從由參數(shù)seekdir設(shè)定的位置開頭計(jì)算一個(gè)位移offset,其中seekdir的值可以是:ios::beg(流開頭的位置〕,ios::cur(流當(dāng)前的位置〕,ios::end(流末尾的位置〕57externextern“C”extern是c/c++語言中說明函數(shù)或全局變
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)庫設(shè)計(jì)與實(shí)施試題及答案
- 快速記憶技巧與公路工程試題及答案
- 超市多元化支付方式與金融科技創(chuàng)新考核試卷
- 學(xué)會(huì)識(shí)別公路工程考試試題及答案技巧
- 保健食品行業(yè)供應(yīng)鏈金融創(chuàng)新考核試卷
- 金屬加工中的金屬成形技術(shù)考核試卷
- 谷物加工中的谷物粉碎與磨粉工藝考核試卷
- 谷物磨制工藝在食品產(chǎn)業(yè)可持續(xù)發(fā)展中的應(yīng)用考核試卷
- 行政組織理論的實(shí)務(wù)應(yīng)用與2025年試題及答案
- 大數(shù)據(jù)技術(shù)在媒體運(yùn)營中的價(jià)值試題及答案
- 2025年五金采購合同與價(jià)格明細(xì)
- 【初中生物】光合作用(第1課時(shí))課件-2024-2025學(xué)年人教版生物學(xué)七年級(jí)下冊(cè)
- 2025年高考語文古詩詞鑒賞主題閱讀與理解試題
- 樸樸北森測(cè)評(píng)試題及答案
- 中鐵建設(shè)面試試題及答案
- 2025年消控室考核試題及答案
- 衛(wèi)健系統(tǒng)2025年上半年安全生產(chǎn)工作總結(jié)
- 餐廳食材驗(yàn)收培訓(xùn)
- 麻精藥品規(guī)范化管理與使用
- 廬江縣2024-2025學(xué)年四下數(shù)學(xué)期末達(dá)標(biāo)測(cè)試試題含解析
評(píng)論
0/150
提交評(píng)論