版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
TheC++ProgrammingLanguage
Chapter10流,異常C++中的I/O標(biāo)準(zhǔn)流異常與錯(cuò)誤C++中的I/O標(biāo)準(zhǔn)流cincoutcerrclogiostream類庫(kù)/usr/local/include/c++/3.2 [UNIX]/usr/include/c++/3.2.2 [LINUX]
cerr(無(wú)緩沖標(biāo)準(zhǔn)錯(cuò)誤)-----沒(méi)有緩沖,發(fā)送給它的內(nèi)容立即被輸出clog(緩沖標(biāo)準(zhǔn)錯(cuò)誤)--------有緩沖,緩沖區(qū)滿時(shí)輸出
cout-------------------------標(biāo)準(zhǔn)輸出
三個(gè)都是ostream類定義的輸出流對(duì)象,
cout是在終端顯示器輸出,cout流在內(nèi)存中對(duì)應(yīng)開(kāi)辟了一個(gè)緩沖區(qū),用來(lái)存放流中的數(shù)據(jù),當(dāng)向cout流插入一個(gè)endl,不論緩沖區(qū)是否漫了,都立即輸出流中所有數(shù)據(jù),然后插入一個(gè)換行符.
cerr流對(duì)象是標(biāo)準(zhǔn)錯(cuò)誤流,指定為和顯示器關(guān)聯(lián),和cout作用差不多,有點(diǎn)不同就是cout
通常是傳到顯示器輸出,但可以被重定向輸出到文件,而cerr流中的信息只能在顯示器輸出.
clog流也是標(biāo)準(zhǔn)錯(cuò)誤流,作用和cerr一樣,區(qū)別在于cerr不經(jīng)過(guò)緩沖區(qū),直接向顯示器輸出信息,而clog中的信息存放在緩沖區(qū),緩沖區(qū)滿或者遇到endl時(shí)才輸出.
C++中I/O的結(jié)構(gòu)iosistreamostreamfstreamiostreamifstreamofstream標(biāo)準(zhǔn)I/O流cincoutcerrclog標(biāo)準(zhǔn)流程序myIO.cc#include<iostream>usingnamespacestd;intmain(){ charch;cout<<"Pleaseentersomenumber."<<endl;cin.get(ch);cout<<"ch="<<ch<<"x"<<endl; inti;floatf;cin>>i>>f; cout<<"i="<<i<<endl;cout<<"f="<<f<<endl;}cin流AstandardistreamobjectBuffered,standardinputDefaultiskeyboardistream流的操作>>操作get()getline()read()ignore()peek()putback()seekg()>>操作>>的連續(xù)使用為什么可以連續(xù)使用>>操作?>>的返回值>>操作返回一個(gè)istream對(duì)象的引用>>操作的重載功能get()操作get()操作讀取單個(gè)字符返回一個(gè)整數(shù)字符的ASCII碼?get對(duì)回車換行的處理get(char&)操作讀取單個(gè)字符返回一個(gè)istream對(duì)象的引用getline()操作讀取一行遇到回車鍵返回istream對(duì)象的引用getline()操作與>>的區(qū)別:charstring1[256],cin.getline(string1,256);//getawholelinecin>>string1;//stopatthe1stblankspaceread()操作read(buf,len)返回一個(gè)istream對(duì)象的引用多用于文件,對(duì)‘\n’照讀不誤:ifstreamfis("edata.dat",ios::binary);istreamis=fis.read((char*)&Object,sizeof(Object));cout<<is.gcout();//打印本次實(shí)際讀取的字節(jié)數(shù)ignore()操作ignore(len,delimiter)忽略len個(gè)字符或者遇到‘\n’cin.ignore(255,‘\n’);//clearoutthebufferpeek()與putback()peek()查看而不讀取一個(gè)字符if(cin.peek()==‘*’)…Peeknextcharacter. Readsandreturnsthenextcharacterwithoutextractingitfromthestream. ReturnsEOFifstreamisattheendoffileandinanycasewheremembergood()(ios::good)wouldreturnfalseParameters. none
ReturnValue.
ThevalueofthenextcharacterinstreamorEOF.putback()向輸入流中插入一個(gè)字符串(必須和istream::get(char&)一起使用,否則流將不能使用)if(ch==‘*’)cin.putback(‘$’)...Putthelastcharacterbacktostream.
Decrementsthenext-characterpointerfortheinputbufferifcwasthelastcharactergotfromthestream.Parameters.c--Thecharactertoputback.Musthavethesamevalueasthelastcharacterextracted.ReturnValue.
Thefunctionreturns*thisifstream文件流輸入”include<fstream>”將一個(gè)文件打開(kāi),并按流的方式輸入初始化一個(gè)ifstream流對(duì)象ifstreamfin("MyFile.txt");文件流的操作>>操作fin.get(ch)//charchfin.getline(buffer,MAX)//charbuffer[MAX]fin.eof()文件輸入的例子ifstreammyfin("myfile.txt");charline[120];intmyInt=0;…myfin.getline(line,120);myfin>>myInt;…myfin.close();使用ifstream的fin.cc#include<fstream>#include<iostream>usingnamespacestd;intmain(){ ifstreaminf("test.txt");charbuf[200];inf.getline(buf,200);cout<<"buf="<<buf<<endl; inti;inf>>i; cout<<"i="<<i<<endl; charch;ch=inf.get(); cout<<"ch="<<ch<<endl;ch=inf.get();cout<<"ch="<<ch<<endl;inf.close();}使用ifstream的fwc.cc#include<iostream>#include<fstream>using
namespacestd;intmain(intargc,char**argv){ifstreamfin(argv[1]);
charline[100];
while(fin.getline(line,100)){cout<<line<<endl;}fin.close();}使用ifstream的fwc.cc#include<iostream>using
namespacestd;#include<fstream>intmain(intargc,char**argv){
ifstreamfin(argv[1]);
charline[100]={‘\0’};
while(!fin.eof()) {
streamsizelen=fin.read(line,100).gcount();cout<<line;}fin.close();}seekg()操作流指針定位ostream&seekg(off_typeoffset,ios::seekdirorigin);ostream&seekg(pos_typeposition);cout流AstandardostreamobjectBuffered,standardoutputDefaultisscreenostream的操作operator<<put()write()width()fill()setf()seekp()<<操作<<的連續(xù)使用為什么可以連續(xù)使用<<操作?<<的返回值<<操作返回一個(gè)ostream對(duì)象的引用<<操作的重載功能put()操作put()操作輸出單個(gè)字符返回一個(gè)ostream對(duì)象的引用cout.put(‘H’).put(‘i’);write()操作write(buf,len)write()返回一個(gè)ostream對(duì)象的引用cout.write(buf,len)//charbuf[len]write()操作文件拷貝ifstreamfin(“/home/sf/eclipse.tar.gz”);ifstreamfin(“/home/sf/eclipse1.tar.gz”);charline[4096]={‘\0’};while(!fin.eof()){streamsizelen=fin.read(line,4096).gcount();fout.write(line,len);}fin.close();fout.close();seekp()操作流指針定位ostream&seekp(off_typeoffset,ios::seekdirorigin);ostream&seekp(pos_typeposition);width()操作輸出的默任寬度cout.width(10);cout<<123.4<<endl;//C:>123.4cout<<123<<endl;fill()操作按width()操作所定的寬度,對(duì)于指定用于填充空檔位的字符cout.width(10);cout.fill(‘#’);cout<<123.456<<endl;//C:>##########123.456cout<<123<<endl;setf()操作設(shè)輸出標(biāo)志操作常見(jiàn)的輸出控制標(biāo)志:
cout.setf(ios::left)ios::leftios::rightios::decios::octios::hexios::showbaseios::showpointios::uppercaseios::showposios::scientificsetf()操作Firstway:intnumber=0x3FF;cout.setf(ios::dec);cout<<"Decimal:"<<number<<endl;cout.unsetf(ios::dec);cout.setf(ios::hex);cout<<"Hexadecimal:"<<number<<endl;Notethattheprecedingcodeisfunctionallyidenticalto:intnumber=0x3FF;cout<<"Decimal:"<<number<<endl<<hex<<"Hexadecimal:"<<number<<dec<<endl;格式化輸出1特殊字符\n (newline)\r (return)\t\\\a (bell)格式化輸出2輸出控制符flushclearoutbufferendlinserta‘\n’,andclearoutbufferoctsettheoutputasoct.dechexofstreamofstream(fileName,mode)ios::app:startwritingatendoffileios::ate:startreadingorwritingatendoffileIos::in:openforreadingios::trunc:truncatefiletozerolengthifitexistsios::nocreate:errorwhenopeningiffiledoesnotexistios::noreplace:errorwhenopeningforoutputiffileexists.ios::binary:openfileinbinarymode.ios::out:openforwritingE.g.fstreamfile;file.open("Group.dat",ios::app|ios::out|ios::in|ios::binary);文件輸出的例子fOut.cc#include<fstream>#include<iostream>usingnamespacestd;intmain(){ ofstreamfout("test.txt"); intk; charbuf[50];
fout<<"Thisisatextfile."<<endl; cout<<"Pleaseenteranumber:"; cin>>k; fout<<"Thenumberyouenteredis"<<k<<endl; cout<<"Pleaseenteraword:"; cin>>buf; fout<<"Thewordyouenteredis:"<<buf<<endl; fout.close();}程序ifof.cc#include<iostream>usingnamespacestd;#include<fstream>charconvert(charc){ if((c>='0')&&(c<='9')) return'#';if((c>='A')&&(c<='Z')){returnc+32; }if((c>='a')&&(c<='z')){ returnc-32; }returnc;}程序ifof.ccintmain(intargc,char**argv){ ifstreamfin(argv[1]);ofstreamfout(argv[2]);for(;;){charch=fin.get();if(!fin.eof())fout<<convert(ch);elsebreak; }; fin.close(); fout.close();}對(duì)對(duì)象的文件操作將一個(gè)對(duì)象寫入一個(gè)文件從文件中讀入并恢復(fù)一個(gè)對(duì)象:程序obFile.cc#include<fstream>#include<iostream>usingnamespacestd;classAnimal{public: Animal(intweight,longdays):itsWeight(weight),DaysAlive(days){} ~Animal(){} intGetWeight()const{returnitsWeight;} voidSetWeight(intweight){itsWeight=weight;} longGetDaysAlive()const{returnDaysAlive;} voidSetDaysAlive(longdays){DaysAlive=days;}private: intitsWeight; longDaysAlive;};程序obFile.ccintmain(intargc,char*argv[])//returns1onerror{ if(argc!=2) { cout<<"Usage:"<<argv[0]<<"<filename>"<<endl; return(1); } ofstreamfout(argv[1],ios::binary); if(!fout) { cout<<"Unabletoopen"<<argv[1]<<"forwriting.\n"; return(1); } AnimalBear(50,100); fout.write((char*)&Bear,sizeofBear); fout.close();程序obFile.cc ifstreamfin(argv[1],ios::binary); if(!fin) { cout<<"Unabletoopen"<<argv[1]<<"forreading.\n"; return(1); } AnimalBearTwo(1,1); cout<<"BearTwoweight:"<<BearTwo.GetWeight()<<endl; cout<<"BearTwodays:"<<BearTwo.GetDaysAlive()<<endl; fin.read((char*)&BearTwo,sizeofBearTwo); cout<<"BearTwoweight:"<<BearTwo.GetWeight()<<endl; cout<<"BearTwodays:"<<BearTwo.GetDaysAlive()<<endl; fin.close(); return0;} Exception異常,意外,出錯(cuò)程序常見(jiàn)問(wèn)題介紹錯(cuò)誤的類型人為的客觀的錯(cuò)誤的處理方法傳統(tǒng)的異常方式bulletproofBugsProgrammermademistakeLogicerrorProgrammermisunderstandtheproblemorsolutionExceptionUnusualbutpredictable.異常異常的特點(diǎn)客觀存在,不能消滅但能夠預(yù)測(cè)并有選擇性的去處理Youcanprepareforthem.典型的異常你知道計(jì)算機(jī)可能會(huì)耗光內(nèi)存當(dāng)沒(méi)有更多內(nèi)存空間時(shí),你:死機(jī)通知用戶并退出程序通知用戶并讓用戶來(lái)處理采取適當(dāng)?shù)募m正行動(dòng),讓用戶不受干擾C++提供的異常處理機(jī)制Exception是一個(gè)對(duì)象出現(xiàn)意外的地方將會(huì)產(chǎn)生一個(gè)異常:拋出一個(gè)異常對(duì)象該對(duì)象被傳遞到負(fù)責(zé)意外處理的地方由負(fù)責(zé)意外處理的代碼專門進(jìn)行統(tǒng)一的異常處理異常對(duì)象包含有意外發(fā)生的詳細(xì)信息常見(jiàn)的異常常見(jiàn)的異常比如:內(nèi)存請(qǐng)求失敗文件操作不成功異常的發(fā)生都在程序的較底層異常的表現(xiàn)都在較高層,對(duì)異常的處理邏輯也都在較高層面,特別是直接與用戶打交道的代碼。異常提供了一個(gè)快速的通道,把異常信息從其發(fā)生的地方直接傳遞到對(duì)意外進(jìn)行處理的地方異常的產(chǎn)生任何時(shí)候,程序在執(zhí)行中遇到了非正常狀況都可以拋出異常異常用throw語(yǔ)句拋出A*p=newA();if(p==NULL){ throw"OutofMemory.";}一旦拋出異常,則程序?qū)⒃趖hrow語(yǔ)句處跳出異常的捕捉異常也由程序員負(fù)責(zé)捕獲用try{…}catch(){…}語(yǔ)句來(lái)捕獲異常沒(méi)有捕獲的異常將被忽略try{
}catch(OutOfMemory){ …}catch(FileNotFound){ …}異常的傳遞產(chǎn)生異常之后,程序會(huì)立刻跳轉(zhuǎn)跳出到最近的一層捕獲異常的語(yǔ)句如果當(dāng)前沒(méi)有捕獲語(yǔ)句或者捕獲語(yǔ)句中沒(méi)有匹配的異常,則程序會(huì)跳出當(dāng)前的函數(shù)在函數(shù)的調(diào)用處,如果沒(méi)有捕獲住異常,則直接跳轉(zhuǎn)到更高一層的調(diào)用者如果一直沒(méi)有捕獲該異常,C++將會(huì)使用默認(rèn)的異常處理函數(shù)該處理函數(shù)可能會(huì)讓程序最終跳出main函數(shù)并導(dǎo)致程序異常終止拋異常的例子#include<iostream>usingnamespacestd;intmain(){ inta,b; a=8; b=4; doublec=a/b; cout<<c<<endl;}a=8;b=0;c=a/b;…if(b==0) throw"DividedbyZero!";else{doublec=a/b;cout<<c<<endl;}捕獲異常#include<iostream>usingnamespacestd;intmain(){ inta,b; a=8; b=4;try{if(b==0) throw"DividedbyZero!"; else{doublec=a/b;cout<<c<<endl;}}catch(…){ cout<<"Exceptioncaught!"<<endl;}}異常傳遞的例子#include<iostream>usingnamespacestd;voidf1(){ … throw"Aexception."; …}voidf2(){ f1();}intmain(){ … f2(); …}多層異常的捕獲try{
}catch(OutOfMemory){
…}catch(FileNotFound){
…}catch(…){
…}捕捉異常的形參與值多重catch語(yǔ)句異常匹配的順序異常對(duì)象的添值異常的類型異常就是一個(gè)對(duì)象異常也會(huì)有類型自定義異常用戶自定義的異常自定義異常的例子自己定義OutOfRang類并拋出一個(gè)OutOfRang對(duì)象作為異常程序array.cc…………….int&MyArray::operator[](intidx){ if((idx>=max)||(idx<0)){ //throw"OutOfRange"; thrownewOutOfRange(max,idx);}else returnpV[idx]; }………………..Innerclass定義在一個(gè)類里面的類異常類常封裝為innerclassInnerclassexampleexcpt.cc#include<iostream>usingnamespacestd;classMyClass{ intscore;public:classinnerE{intval;cha
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版物流運(yùn)輸企業(yè)勞動(dòng)合同及運(yùn)輸安全協(xié)議3篇
- 二零二五年度健身房裝修轉(zhuǎn)讓合同3篇
- 2025年度新能源發(fā)電合同:太陽(yáng)能光伏發(fā)電項(xiàng)目設(shè)計(jì)與施工3篇
- 2025年度房產(chǎn)車輛租賃合同:子女創(chuàng)業(yè)資金支持3篇
- 二零二五年度房地產(chǎn)項(xiàng)目聯(lián)合投資開(kāi)發(fā)合同3篇
- 揭秘有機(jī)化學(xué)世界
- 二零二五年度家政服務(wù)合同-月嫂育兒嫂雙重保障服務(wù)協(xié)議3篇
- 運(yùn)動(dòng)賽事雙十一狂歡
- 2024年蕪湖鳩江區(qū)公辦托育園教職工招聘考試真題
- 2024年淮安市第三人民醫(yī)院招聘考試真題
- 班主任育人故事(通用17篇)
- 初二化學(xué)上冊(cè)知識(shí)點(diǎn)7篇
- 汽車保養(yǎng)與維護(hù)
- 2023-2024學(xué)年貴州省黔西南布依族苗族自治州貞豐縣三年級(jí)數(shù)學(xué)第一學(xué)期期末經(jīng)典模擬試題含答案
- 娛樂(lè)場(chǎng)所消防安全操作規(guī)程
- 社區(qū)服務(wù)中心
- 商業(yè)天然氣灶具用氣量明細(xì)
- 物業(yè)公司合規(guī)管理與風(fēng)險(xiǎn)防控全書
- 部編版五年級(jí)語(yǔ)文上冊(cè)作文總復(fù)習(xí)課件
- 八年級(jí)歷史期末考試試卷質(zhì)量分析試卷分析
- 煙草專業(yè)個(gè)人簡(jiǎn)歷模板
評(píng)論
0/150
提交評(píng)論