版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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_open48 当文件的读写操作完成之后,我们必需将文件关闭以使文件重新变为可访问的。关闭文件时需要调用成员函数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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混合动力电动汽车结构原理与检修 第2版 课件 学习情景2 混合动力电动汽车高压维修操作安全
- 年末晚会活动策划方案(3篇)
- 牛杂店工人管理制度范本(3篇)
- 甲醇炉燃气安全管理制度(3篇)
- 兽药质检培训
- 线上帮办团队管理制度内容(3篇)
- 蔬菜种植后期管理制度(3篇)
- 通信网管中心管理制度(3篇)
- 饭店协会档案管理制度(3篇)
- 《GA 1016-2012枪支(弹药)库室风险等级划分与安全防范要求》专题研究报告
- 2025年广东省中考语文试卷真题(含答案解析)
- 烫熨治疗法讲课件
- 2025至2030中国模块化变电站行业发展趋势分析与未来投资战略咨询研究报告
- 电厂清洁生产管理制度
- 2025年江苏省事业单位招聘考试教师招聘体育学科专业知识试题
- 机械设计年终述职报告
- 可信数据空间解决方案星环科技
- 建筑工程监理服务承诺书范文
- 知荣明耻主题班会课件
- 职业技术学院工业机器人技术高职技能考核标准1022(简化版)
- 声学基础课后题答案
评论
0/150
提交评论