方向学习及练习chapter 10_第1页
方向学习及练习chapter 10_第2页
方向学习及练习chapter 10_第3页
方向学习及练习chapter 10_第4页
方向学习及练习chapter 10_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TheC++ProgrammingLanguage

Chapter10流,异常C++中的I/O标准流异常与错误C++中的I/O标准流cincoutcerrclogiostream类库/usr/local/include/c++/3.2 [UNIX]/usr/include/c++/3.2.2 [LINUX]

cerr(无缓冲标准错误)-----没有缓冲,发送给它的内容立即被输出clog(缓冲标准错误)--------有缓冲,缓冲区满时输出

cout-------------------------标准输出

三个都是ostream类定义的输出流对象,

cout是在终端显示器输出,cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符.

cerr流对象是标准错误流,指定为和显示器关联,和cout作用差不多,有点不同就是cout

通常是传到显示器输出,但可以被重定向输出到文件,而cerr流中的信息只能在显示器输出.

clog流也是标准错误流,作用和cerr一样,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出.

C++中I/O的结构iosistreamostreamfstreamiostreamifstreamofstream标准I/O流cincoutcerrclog标准流程序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()>>操作>>的连续使用为什么可以连续使用>>操作?>>的返回值>>操作返回一个istream对象的引用>>操作的重载功能get()操作get()操作读取单个字符返回一个整数字符的ASCII码?get对回车换行的处理get(char&)操作读取单个字符返回一个istream对象的引用getline()操作读取一行遇到回车键返回istream对象的引用getline()操作与>>的区别:charstring1[256],cin.getline(string1,256);//getawholelinecin>>string1;//stopatthe1stblankspaceread()操作read(buf,len)返回一个istream对象的引用多用于文件,对‘\n’照读不误:ifstreamfis("edata.dat",ios::binary);istreamis=fis.read((char*)&Object,sizeof(Object));cout<<is.gcout();//打印本次实际读取的字节数ignore()操作ignore(len,delimiter)忽略len个字符或者遇到‘\n’cin.ignore(255,‘\n’);//clearoutthebufferpeek()与putback()peek()查看而不读取一个字符if(cin.peek()==‘*’)…Peeknextcharacter. Readsandreturnsthenextcharacterwithoutextractingitfromthestream. ReturnsEOFifstreamisattheendoffileandinanycasewheremembergood()(ios::good)wouldreturnfalseParameters. none

ReturnValue.

ThevalueofthenextcharacterinstreamorEOF.putback()向输入流中插入一个字符串(必须和istream::get(char&)一起使用,否则流将不能使用)if(ch==‘*’)cin.putback(‘$’)...Putthelastcharacterbacktostream.

Decrementsthenext-characterpointerfortheinputbufferifcwasthelastcharactergotfromthestream.Parameters.c--Thecharactertoputback.Musthavethesamevalueasthelastcharacterextracted.ReturnValue.

Thefunctionreturns*thisifstream文件流输入”include<fstream>”将一个文件打开,并按流的方式输入初始化一个ifstream流对象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()<<操作<<的连续使用为什么可以连续使用<<操作?<<的返回值<<操作返回一个ostream对象的引用<<操作的重载功能put()操作put()操作输出单个字符返回一个ostream对象的引用cout.put(‘H’).put(‘i’);write()操作write(buf,len)write()返回一个ostream对象的引用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()操作所定的宽度,对于指定用于填充空档位的字符cout.width(10);cout.fill(‘#’);cout<<123.456<<endl;//C:>##########123.456cout<<123<<endl;setf()操作设输出标志操作常见的输出控制标志:

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();}对对象的文件操作将一个对象写入一个文件从文件中读入并恢复一个对象:程序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异常,意外,出错程序常见问题介绍错误的类型人为的客观的错误的处理方法传统的异常方式bulletproofBugsProgrammermademistakeLogicerrorProgrammermisunderstandtheproblemorsolutionExceptionUnusualbutpredictable.异常异常的特点客观存在,不能消灭但能够预测并有选择性的去处理Youcanprepareforthem.典型的异常你知道计算机可能会耗光内存当没有更多内存空间时,你:死机通知用户并退出程序通知用户并让用户来处理采取适当的纠正行动,让用户不受干扰C++提供的异常处理机制Exception是一个对象出现意外的地方将会产生一个异常:抛出一个异常对象该对象被传递到负责意外处理的地方由负责意外处理的代码专门进行统一的异常处理异常对象包含有意外发生的详细信息常见的异常常见的异常比如:内存请求失败文件操作不成功异常的发生都在程序的较底层异常的表现都在较高层,对异常的处理逻辑也都在较高层面,特别是直接与用户打交道的代码。异常提供了一个快速的通道,把异常信息从其发生的地方直接传递到对意外进行处理的地方异常的产生任何时候,程序在执行中遇到了非正常状况都可以抛出异常异常用throw语句抛出A*p=newA();if(p==NULL){ throw"OutofMemory.";}一旦抛出异常,则程序将在throw语句处跳出异常的捕捉异常也由程序员负责捕获用try{…}catch(){…}语句来捕获异常没有捕获的异常将被忽略try{

}catch(OutOfMemory){ …}catch(FileNotFound){ …}异常的传递产生异常之后,程序会立刻跳转跳出到最近的一层捕获异常的语句如果当前没有捕获语句或者捕获语句中没有匹配的异常,则程序会跳出当前的函数在函数的调用处,如果没有捕获住异常,则直接跳转到更高一层的调用者如果一直没有捕获该异常,C++将会使用默认的异常处理函数该处理函数可能会让程序最终跳出main函数并导致程序异常终止抛异常的例子#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语句异常匹配的顺序异常对象的添值异常的类型异常就是一个对象异常也会有类型自定义异常用户自定义的异常自定义异常的例子自己定义OutOfRang类并抛出一个OutOfRang对象作为异常程序array.cc…………….int&MyArray::operator[](intidx){ if((idx>=max)||(idx<0)){ //throw"OutOfRange"; thrownewOutOfRange(max,idx);}else returnpV[idx]; }………………..Innerclass定义在一个类里面的类异常类常封装为innerclassInnerclassexampleexcpt.cc#include<iostream>usingnamespacestd;classMyClass{ intscore;public:classinnerE{intval;cha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论