




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1IO和异样处理2什么是异样处理异样处理就是处理程序中的错误3为什么须要异样处理1,一个库的作者可以检测动身生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);2,库的用户知道怎样处理这些错误,但却无法检查它们何时发生(假如能检测,就可以再用户的代码里处理了,不用留给库去发觉)4异样处理的基本思想让一个函数在发觉了自己无法处理的错误时抛出(throw)一个异样,然后它的(干脆或者间接)调用者能够处理这个问题。也就是将问题检测和问题处理相分别在全部支持异样处理的编程语言中,要相识到的一个思想:在异样处理过程中,由问题检测代码可以抛出一个对象给问题处理代码,通过这个对象的类型和内容,事实上完成了两个部分的通信,通信的内容是“出现了什么错误”5C语言的异样处理在C语言中,对错误的处理有两种方法:一是运用整型的返回值标识错误;二是运用errno宏(可以简洁的理解为一个全局整型变量)去记录错误。C++中照旧可以用这两种方法缺陷:出现不一样问题。例如有些函数返回1表示成功,返回0表示出错;而有些函数返回0表示成功,返回非0表示出错。函数的返回值只有一个。你通过函数的返回值表示错误代码,那么函数就不能返回其他的值。当然,你也可以通过指针或者C++的引用来返回另外的值,但是这样可能会令你的程序略微晦涩难懂(可能你对指针的运用不是很厉害)6运用异样处理的优点函数的返回值可以忽视,但异样不行忽视。假如程序出现异样,但是没有被捕获,程序就会终止,这多少会促使程序员开发出来的程序更健壮一点。而假如运用C语言的error宏或者函数返回值,调用者都有可能遗忘检查,从而没有对错误进行处理,结果造成程序莫名其面的终止或出现错误的结果整型返回值没有任何语义信息。而异样却包含语义信息,有时从类名就能够体现出来。整型返回值缺乏相关的上下文信息。异样作为一个类,可以拥有自己的成员,这些成员就可以传递足够的信息。异样处理可以在调用跳级。假设在有多个函数的调用栈中出现了某个错误,运用整型返回码要求你在每一级函数中都要进行处理。而运用异样处理的栈绽开机制,只须要在一处进行处理就可以了,不须要每级函数都处理7异样的语法try{可能会抛出异样的语句块throw异样;}catch(datatype_1)//异样处理{}catch(datatype_2){}...catch(datatype_i){}catch(...)//除了上述异样的其它异样的处理{}8异样处理实例except1.cppexcept2.cppNestedExceptionHandle.cpp9异样处理依次ExceptHandleOrder.cpp10异样处理voidExceptFunc(arg…)throw(Except1,Except2,….)对抛出的异样类型进行说明voidExceptionFunction(argument…)throw()没有任何异样抛出voidExceptionFunction(argument…)可能抛出任何一种异样,也可能没有异样,意义是最广泛的11异样处理留意事项(1)try和catch块中必须要用花括号括起来,即使花括号内只有一个语句也不能省略花括号;(2)try和catch必需成对出现,一个try_catch结果中只能有一个try块,但可以有多个catch块,以便与不同的异样信息匹配;(3)假如在catch块中没有指定异样信息的类型,而用删节号"...",则表示它可以捕获任何类型的异样信息;(4)假如throw不包括任何表达式,表示它把当前正在处理的异样信息再次抛出,传给其上一层的catch来处理;(5)C++中一旦抛出一个异样,假如程序没有任何的捕获,那么系统将会自动调用一个系统函数terminate,由它调用abort终止程序12标准异样13最顶层基类是exception,供应了what()虚函数用来描述错误14151617IO和异样处理18IO和异样处理19IO流ostream的常规操作istream的常规操作文件的基本操作流程文件的其他操作2021cin ------ 标准的输入cout ------ 标准的输出cerr ------ 标准的错误输出(不带缓冲)clog ------ 标准的错误输出(缓冲的)外部声明在namespacestd中/usr/include/c++/4.6/iostreamcerr与cout的区分同样都是输出数据,但是在集成开发工具下(eclipse)cerr输出内容的颜色是红色的输出设备可能不同IO的全局对象22inti=10;cout<<"i="<<i<<endl;cin>>i;
键入键值inti存放 inti显示
|
| |
键盘-------->内存--------->终端
| |
输入过程 输出过程输入和输出的过程23IO分类设备IO 屏幕/键盘文件IO 文件字符串IO 字符串2425ostream流类对应每个基本数据类型都有友元,它们在iostream中声明:流原理cout是ostream流类的对象,在iostream头文件中定义:ostreamcout(stdout);
//标准设备名作为其构造时的参数
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的全局对象,istream流类也有若干个友元:istream&operator>>(istream&dest,char*pSource);
istream&operator>>(istream&dest,intsource);
istream&operator>>(istream&dest,charsource);
...29ostream成员函数operator<<输出运算符函数:可以连续的输出put(charch)输出单个字符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科学计数法31intn;cout<<"Enteradecimalnumber:";cin>>n;cout<<n<<"inhexadecimalis:"
<<hex<<n<<'\n'
<<dec<<n<<"inoctalis:"
<<oct<<n<<'\n' <<setbase(10)<<n<<"indecimalis:" <<n<<endl;
整数通常被说明为十进制(基数为10)整数运用hex,dec,oct,setbase()可变更基数必需在程序中包含头文件iomanip32设置浮点数精度(precision、setprecision)设置了精度以后,该精度对之后全部的输出操作都有效,直到下一次设置精度为止无参数的成员函数percision返回当前设置的精度for(places=0;places<=9;places++)
{
cout.precision(places);
cout<<root2<<'\n';
}
for(places=0;places<=9;places++)
cout<<setprecision(places)<<root2<<'\n';33设置域宽(setw(uint)、width(uint))成员函数ios.width设置当前的域宽(即输入输出的字符数)并返回以前设置的域宽。假如显示数据所需的宽度比设置的域宽小,空位用填充字符填充。假如显示数据所需的宽度比设置的域宽大,显示数据并不会被截断,系统会输出全部位。域宽设置仅对下一行流读取或流插入操作有效,在一次操作完成之后,城宽又被置回034intmain()
{
intw=4;charstring[10];cout<<"Enterasentence:\n";cin.width(5);//设置输入宽度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
练习
* *** *************
图形一金字塔********* 图形二倒影38istream成员函数>>:输入运算符函数charget(char) 输入单个字符getline():获得一行。遇到换行字符结束全局函数:getline(istream&,string);成员函数:getline(char*,intlimit);charpeek():peek瞥一眼当输入缓冲区中没有数据的时候,等待用户输入,返回输入缓冲区中第一个字符39boolbad()读写的过程中出错,返回trueboolfail()读写的过程出错,或者格式读取错误也会返回truebooleof()读文件到末尾时,返回trueboolgood()文件读写正常返回true在系统中流坏掉了主要不是真正不能运用了,而是将监控流状态的的标记量设置成了false若想重置以上成员函数检查的状态标记,可以运用clear()函数验证流状态40留意点:(1)peek()/ignore()会等待用户输入键值这些键值包含空格。(2)处理字符串输入问题一般运用全局的getline()。(3)get()只能获得字符,其他数据类型不能获得。putback(chara):放回函数将一个字符放回到缓冲区中ignore(intlen,charch):忽视函数忽视len个字符,ch是结束标记41缓冲区cin/cout都是带缓冲区的cin>>会检查输入缓冲区中是否有数据存在,当没有数据的时候,就等待用户从键盘输入,然后再到输入缓冲区中取数据;当有数据的时候,干脆将取到的数据存放到内存中cin>>i;并不是干脆将键盘输入的值存放在内存中的键盘-------->缓冲区------->内存42数组越界数组越界的后果(1)cin>>干脆报栈溢出(2)cin.getline()会影响后面的输入43操作文件的3大类ofstream写文件类将数据输出到文件上ifstream读文件类将文件数据存放在内存中fstream 读写文件类运用上述3大类:必需#include<fstream>44文件的打开利用构造函数打开文件ifstreamfile(constchar*pFilePath,openMode)默认以输入方式打开文件ofstreamfile(constchar*pFilePath,openMode)默认以输出方式打开文件fstreamfile(constchar*pFilePath,openMode)以输入输出方式打开文件45ios::app
追加模式打开文件ios::ate
打开并找到文件尾ios::binary二进制方式打开文件ios::in
输入(读)模式打开文件ios::out
输出(写)模式打开文件ios::trunc
若文件已经存在则清空文件的模式打开文件用位域操作符|组合这些标记46实例向现有文件中添加二进制数据ofstreamlogfile("login.dat",ios::binary|ios::app);读、写、将文件设定为空fstreamtest("hahahah",ios::in|ios::out|ios::trunc);47文件的打开利用open()函数打开文件ofstreamofile;ofile.open(constchar*filename,openmode)推断文件的打开:(1)对象(2)is_open()48 当文件的读写操作完成之后,我们必需将文件关闭以使文件重新变为可访问的。关闭文件时须要调用成员函数close(),它负责将缓存中的数据排放出来并关闭文件。 这个函数一旦被调用,原来的流对象就可以被用来打开其他的文件了,这个文件也可以重新被其他的进程访问了。文件的关闭49fstreamfile;file.open(“example”,ios::out|ios::app|ios::binary);if(file!=NULL){
cout<<“openfailed”<<endl;}//…….文件操作file.close();50文件输出文件输出(写文件)方式一:运用“<<”运算符 由于ofstream由ostream引申而来,所以可以同cout一样运用“<<“插入操作符ofstreamofile(“example”);if(!ofile.is_open()){
cout<<“openfailed”<<endl; return;}ofile<<“pear”<<““<<4.5<<endl;ofile.close();51文件输出(写文件)方式二:二进制文件的输出 运用write成员函数可以对文件进行二进制的输出,打开文件时,指定二进制打开模式文件输出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文件输入文件输入(读文件)方式一:运用“>>“运算符 由于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文件输入文件输入(读文件)方式二:二进制文件的读取 运用read成员函数可以对文件进行二进制的输入,打开文件时,指定二进制打开模式ifstreamifile(“example”,ios::in|ios::binary);if(!ifile.is_open()){
cout<<“openfailed”<<endl; return;}charszText[10]={0};ifile.read(szText,sizeof(szText));//读取格式与写入格式要对应cout<<“thefilecontentis:”<<szText<<endl;ifile.close();54boolbad()读写的过程中出错,返回trueboolfail()读写的过程出错,或者格式读取错误也会返回truebooleof()读文件到末尾时,返回trueboolgood()文件读写正常返回true在系统中流坏掉了主要不是真正不能运用了,而是将监控流状态的的标记量设置成了false若想重置以上成员函数检查的状态标记,可以运用clear()函数验证流状态55文件指针流指针的设置全部的输入/输出流对象都至少有一个流指针: ifstream:有一个getpointer指针,指向下一个被读取的元素 ofstream:有一个putpointer指针,指向写入下一个元素的位置 fstream:同时继承了get和put指针56流指针相关函数tellg()和tellp() 返回一个pos_type类型,即整数,分别代表当前读指针(get)和写指针(put)的位置seekg(pos_typeposition)和seekp(pos_typeposition) 流指针被变更为指向文件起先计算的一个确定位置,传入的参数类型与函数tellg和tellp的返回值类型相同seekg(offset,seekdir)和seekp(offset,seekdir) 从由参数seekdir设定的位置起先计算一个位移offset,其中seekdir的值可以是:ios::beg(流起先的位置),ios::cur(流当前的位置),ios::end(流末尾的位置)57externextern“C”extern是c/c++语言中表明函数或全局变量作用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 律师见证授权书3篇
- 安全炊事员责任书3篇
- 夜不归宿的自我反省与誓言3篇
- 售卖猫咪合同范本3篇
- 关于农村房屋赠与合同3篇
- 学生归家安全承诺书3篇
- 叉车操作员工作满意度调查3篇
- 供水工程质量保修协议3篇
- 公司注册委托书应注意哪些问题
- 家长积极参与学校活动的保证书3篇
- HY/T 082-2005珊瑚礁生态监测技术规程
- 我们对于一棵古松的三种态度朱光潜朱光潜课件
- 建筑机械使用安全技术规程 jgj33-2012
- 一例给药错误不良事件汇报
- 《查理和巧克力工厂》-共24张课件
- 除污器技术规格书
- 小学语文教师面试《绿》试讲稿
- D502-15D502等电位联结安装图集
- 2022年本科教学工作合格评估整改工作方案
- 广东省建设工程造价咨询服务收费项目和收费标准表[粤价函(2011)742号]
- 小学二年级三位数竖式计算800题
评论
0/150
提交评论