




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1IO和异常处理2什么是异常处理异常处理就是处理程序中的错误3为什么需要异常处理1,一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);2,库的用户知道怎样处理这些错误,但却无法检查它们何时发生(如果能检测,就可以再用户的代码里处理了,不用留给库去发现)4异常处理的基本思想让一个函数在发现了自己无法处理的错误时抛出(throw)一个异常,然后它的(直接或者间接)调用者能够处理这个问题。也就是将问题检测和问题处理相分离在所有支持异常处理的编程语言中,要认识到的一个思想:在异常处理过程中,由问题检测代码可以抛出一个对象给问题处理代码,通过这个对象的类型和
2、内容,实际上完成了两个部分的通信,通信的内容是“出现了什么错误”5C语言的异常处理在C语言中,对错误的处理有两种方法:一是使用整型的返回值标识错误;二是使用errno宏(可以简单的理解为一个全局整型变量)去记录错误。C+中仍然可以用这两种方法缺陷: 出现不一致问题。例如有些函数返回1表示成功,返回0表示出错;而有些函数返回0表示成功,返回非0表示出错。 函数的返回值只有一个。你通过函数的返回值表示错误代码,那么函数就不能返回其他的值。当然,你也可以通过指针或者C+的引用来返回另外的值,但是这样可能会令你的程序略微晦涩难懂(可能你对指针的运用不是很厉害)6使用异常处理的优点函数的返回值可以忽略,
3、但异常不可忽略。如果程序出现异常,但是没有被捕获,程序就会终止,这多少会促使程序员开发出来的程序更健壮一点。而如果使用C语言的error宏或者函数返回值,调用者都有可能忘记检查,从而没有对错误进行处理,结果造成程序莫名其面的终止或出现错误的结果整型返回值没有任何语义信息。而异常却包含语义信息,有时从类名就能够体现出来。整型返回值缺乏相关的上下文信息。异常作为一个类,可以拥有自己的成员,这些成员就可以传递足够的信息。异常处理可以在调用跳级。假设在有多个函数的调用栈中出现了某个错误,使用整型返回码要求你在每一级函数中都要进行处理。而使用异常处理的栈展开机制,只需要在一处进行处理就可以了,不需要每级
4、函数都处理7异常的语法try 可能会抛出异常的语句块 throw 异常;catch(datatype_1) /异常处理catch(datatype_2).catch(datatype_i)catch(.) /除了上述异常的其它异常的处理8异常处理实例except1.cppexcept2.cppNestedExceptionHandle.cpp9异常处理顺序ExceptHandleOrder.cpp10异常处理void ExceptFunc(arg) throw(Except1,Except2,.)对抛出的异常类型进行说明void ExceptionFunction(argument) thro
5、w()没有任何异常抛出void ExceptionFunction(argument)可能抛出任何一种异常,也可能没有异常,意义是最广泛的11异常处理注意事项(1)try和catch块中必须要用花括号括起来,即使花括号内只有一个语句也不能省略花括号;(2)try和catch必须成对出现,一个try_catch结果中只能有一个try块,但可以有多个catch块,以便与不同的异常信息匹配;(3)如果在catch块中没有指定异常信息的类型,而用删节号.,则表示它可以捕获任何类型的异常信息;(4)如果throw不包括任何表达式,表示它把当前正在处理的异常信息再次抛出,传给其上一层的catch来处理;(
6、5)C+中一旦抛出一个异常,如果程序没有任何的捕获,那么系统将会自动调用一个系统函数terminate,由它调用abort终止程序12标准异常13最顶层基类是exception,提供了what()虚函数用来描述错误14151617IO和异常处理18IO和异常处理19IO流ostream的常规操作istream的常规操作文件的基本操作流程文件的其他操作2021cin-标准的输入cout -标准的输出cerr-标准的错误输出(不带缓冲)clog-标准的错误输出(缓冲的)外部声明 在 namespace std 中 /usr/include/c+/4.6/iostreamcerr与cout的区别 同
7、样都是输出数据,但是在集成开发工具 下(eclipse)cerr输出内容的颜色是红色的 输出设备可能不同IO的全局对象22int i = 10;int i = 10;cout i = i endl;cout i = i i;cin i; 键入键值键入键值 int i int i 存放存放 int i int i 显示显示 | | | | | | 键盘键盘-内存内存-终端终端 | | | | 输入过程输入过程 输出过程输出过程 输入和输出的过程输入和输出的过程23IO分类设备IO 屏幕/键盘文件IO 文件字符串IO 字符串2425ostream流类对应每个基本数据类型都有友元,它们在iostre
8、am中声明:流原理流原理cout是ostream流类的对象,在iostream 头文件中定义:ostream cout(stdout); ; /标准设备名作为其构造时的参数标准设备名作为其构造时的参数ostream& operator(ostream& dest, ,char* pSource); ;ostream& operator(ostream& dest, ,int source); ;ostream& operator(ostream& dest, ,char source); ;/.27分析语句cout“My name is Jone
9、”;ostream& operator(ostream& dest, ,char* pSource); ;cout this is 7;ostream& operator(istream& dest, ,char* pSource); ;istream& operator(istream& dest, ,int source); ;istream& operator(istream& dest, ,char source); ;.29ostream 成员函数operator 输出运算符函数:可以连续的输出put(char ch)
10、输出单个字符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 科学计数法31int n;cout
11、n;cout n in hexadecimal is: hex n n dec n in octal is: oct n n setbase(10) n in decimal is: n endl;整数通常被解释为十进制(基数为10)整数使用hex,dec,oct,setbase()可改变基数必须在程序中包含头文件iomanip32设置浮点数精度(precision、setprecision)设置了精度以后,该精度对之后所有的输出操作都有效,直到下一次设置精度为止无参数的成员函数percision返回当前设置的精度 for ( places = 0; places = 9; places+ )
12、 cout.precision( places ); cout root2 n; for ( places = 0; places = 9; places+ ) cout setprecision( places ) root2 n;33设置域宽(setw(uint)、width(uint) 成员函数ios.width设置当前的域宽(即输入输出的字符数)并返回以前设置的域宽。如果显示数据所需的宽度比设置的域宽小,空位用填充字符填充。如果显示数据所需的宽度比设置的域宽大,显示数据并不会被截断,系统会输出所有位。域宽设置仅对下一行流读取或流插入操作有效,在一次操作完成之后,城宽又被置回034 in
13、t main() int w = 4; char string 10 ; cout string ) cout.width( w+ ); cout string endl; cin.width( 5 ); return 0; 35#include using namespace std;int main() double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout valuesi n; 36用户自定义的流操纵#include ostream& tab( ostream& o
14、utput ) return output t; cout a tabbtabc : 输入运算符函数char get(char) 输入单个字符getline():获取一行。遇到换行字符结束 全局函数:getline(istream &,string); 成员函数:getline(char *,int limit);char peek():peek 瞥一眼 当输入缓冲区中没有数据的时候,等待用户输入, 返回输入缓冲区中第一个字符39bool bad() 读写的过程中出错,返回truebool fail() 读写的过程出错,或者格式读取错误也会返回truebool eof() 读文件到末尾
15、时,返回truebool good() 文件读写正常返回true在系统中流坏掉了主要不是真正不能使用了,而是将监控流状态的的标志量设置成了false若想重置以上成员函数检查的状态标志,可以使用clear( ) 函数验证流状态40注意点: (1) peek() / ignore() 会等待用户输入键值 这些键值包含空格。 (2)处理字符串输入问题一般使用全局的 getline()。 (3)get()只能获得字符,其他数据类型不能获得。putback(char a):放回函数 将一个字符放回到缓冲区中ignore(int len,char ch):忽略函数 忽略len个字符,ch是结束标志41缓冲
16、区cin / cout 都是带缓冲区的cin 会检查输入缓冲区中是否有数据存在,当没有数据的时候,就等待用户从键盘输入,然后再到输入缓冲区中取数据;当有数据的时候,直接将取到的数据存放到内存中cin i; 并不是直接将键盘输入的值存放在内存中的 键盘 -缓冲区-内存42数组越界数组越界 数组越界的后果数组越界的后果 (1)cin 直接报直接报 栈溢出栈溢出 (2)cin.getline() 会影响后面的输入会影响后面的输入43操作文件的3大类ofstream 写文件类 将数据输出到文件上ifstream 读文件类 将文件数据存放在内存中fstream 读写文件类使用上述3大类: 必须#incl
17、ude 44文件的打开利用构造函数打开文件ifstream file(const char * pFilePath, openMode)默认以输入方式打开文件ofstream file(const char * pFilePath, openMode)默认以输出方式打开文件fstream file(const char * pFilePath, openMode)以输入输出方式打开文件45ios:app 追加模式打开文件追加模式打开文件ios:ate 打开并找到文件尾ios:binary 二进制方式打开文件二进制方式打开文件ios:in 输入(读)模式打开文件输入(读)模式打开文件ios:ou
18、t 输出(写)模式打开文件输出(写)模式打开文件ios:trunc 若文件已经存在则清空文件的模式打开文件若文件已经存在则清空文件的模式打开文件用位域操作符用位域操作符 | | 组合这些标志组合这些标志46实例向现有文件中添加二进制数据ofstream logfile(login.dat, ios:binary | ios:app);读、写、将文件设定为空fstream test(hahahah,ios:in | ios:out | ios:trunc); 47文件的打开利用open()函数打开文件ofstream ofile;ofstream ofile;ofile.open(const c
19、har *filename, openmode)判断文件的打开:判断文件的打开: (1) (1)对象对象 (2)is_open()(2)is_open()48当文件的读写操作完成之后,我们必须将文件关闭以使文件重当文件的读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。关闭文件时需要调用成员函数新变为可访问的。关闭文件时需要调用成员函数close( ),close( ),它负它负责将缓存中的数据排放出来并关闭文件。责将缓存中的数据排放出来并关闭文件。这个函数一旦被调用,原来的流对象就可以被用来打开其他的这个函数一旦被调用,原来的流对象就可以被用来打开其他的文件了,这个文件也可以重新
20、被其他的进程访问了。文件了,这个文件也可以重新被其他的进程访问了。文件的关闭49fstream file;file.open(“example”, ios:out | ios:app | ios:binary);if(file !=NULL) cout“open failed”endl;/. 文件操作文件操作file.close();50文件输出文件输出(写文件)方式一:使用 “ ” 运算符由于由于ofstream 由由 ostream 引申而来,所以可以同引申而来,所以可以同cout 一样使用一样使用 “ 插入操作符插入操作符ofstream ofile(“example”);if( !of
21、ile.is_open() ) cout“open failed”endl;return;ofile“pear”“ “4.5endl;ofile.close();51文件输出(写文件)方式二:二进制文件的输出使用使用write 成员函数可以对文件进行二进制的输成员函数可以对文件进行二进制的输出,打开文件时,指定二进制打开模式出,打开文件时,指定二进制打开模式文件输出ofstream ofile(“example”, ios:out | ios:binary);if( !ofile.is_open() ) cout“open failed”szText;ofile.write(szText, s
22、izeof(szText);ofile.close();52文件输入文件输入(读文件)方式一:使用“ “ 运算符由于由于ifstream 由由 istream 引申而来,所以可引申而来,所以可以同以同cin 一样使用一样使用 “ 插入操作符插入操作符ifstream ifile(“example”);if( !ifile.is_open() ) cout“open failed”szTextprice;cout“ the file content is:”szText“ “priceendl;ifile.close();53文件输入文件输入(读文件)方式二:二进制文件的读取使用使用read 成
23、员函数可以对文件进行二进制的输入,成员函数可以对文件进行二进制的输入,打开文件时,指定二进制打开模式打开文件时,指定二进制打开模式ifstream ifile(“example”, ios:in | ios:binary);if( !ifile.is_open() ) cout“open failed”endl;return;char szText10= 0 ;ifile.read(szText, sizeof(szText); /读读取格式与写入格式要取格式与写入格式要对对应应cout“ the file content is:”szTextendl;ifile.close();54bool
24、 bad() 读写的过程中出错,返回truebool fail() 读写的过程出错,或者格式读取错误也会返回truebool eof() 读文件到末尾时,返回truebool good() 文件读写正常返回true在系统中流坏掉了主要不是真正不能使用了,而是将监控流状态的的标志量设置成了false若想重置以上成员函数检查的状态标志,可以使用clear( ) 函数验证流状态55文件指针流指针的设置流指针的设置 所有的输入/输出流对象都至少有一个流指针:ifstream:有一个:有一个get pointer指针,指向下一个被指针,指向下一个被读取的元素读取的元素ofstream:有一个:有一个pu
25、t pointer指针,指向写入下一指针,指向写入下一个元素的位置个元素的位置fstream:同时继承了:同时继承了get 和和 put 指针指针56流指针相关函数tellg( )和和 tellp( )返回一个返回一个pos_type类型,即整数,分别代表当前读指针类型,即整数,分别代表当前读指针(get) 和和 写指针写指针(put) 的位置的位置seekg( pos_type position ) 和和 seekp( pos_type position )流指针被改变为指向文件开始计算的一个绝对位置,传流指针被改变为指向文件开始计算的一个绝对位置,传入的参数类型与函数入的参数类型与函数te
26、llg 和和 tellp 的返回值类型相同的返回值类型相同seekg( offset, seekdir) 和和 seekp( offset, seekdir)从由参数从由参数seekdir 设定的位置开始计算一个位移设定的位置开始计算一个位移 offset,其中其中seekdir的值可以是:的值可以是: ios:beg(流开始的位置),流开始的位置),ios:cur(流当前的位置),流当前的位置),ios:end(流末尾的位置)流末尾的位置)57externextern “ C ” extern 是是c/c+ 语言中表明函数或全局变量作用范围的关语言中表明函数或全局变量作用范围的关键字,该关键
27、字告诉编译器此,其声明的函数和变量可以键字,该关键字告诉编译器此,其声明的函数和变量可以在本模块或其他模块中使用在本模块或其他模块中使用在在c+的环境下使用的环境下使用c 的函数时,通常会出现编译器无的函数时,通常会出现编译器无法找到法找到 obj 模块中的模块中的c 函数定义的问题,从而导致链接失败函数定义的问题,从而导致链接失败。这是因为在。这是因为在c+ 中支持函数重载,编译时会将函数名和中支持函数重载,编译时会将函数名和参数列表连接起来参数列表连接起来,而,而c 语言不会,因此会造成链接失败的语言不会,因此会造成链接失败的情况,此时情况,此时 c 函数就需要使用函数就需要使用extern “C “ 来进行链接指定来进行链接指定。58extern “ C ”C+ 中引用C 语言的函数/ / 在包含在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国旋转式空气预热器行业市场现状供需分析及投资评估规划分析研究报告
- 主管护师考试案例表达能力试题及答案
- 2025-2030年中国数字兽用秤行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国摩托车离合器行业市场深度分析及前景趋势与投资研究报告
- 执业药师考试过程中常见错误及试题及答案
- 2025年护士职业资格试题及答案翻阅
- 主管护师考试中常见护理问题试题及答案
- 行政管理与经济法的相辅相成试题及答案
- 2025辽宁鞍山市海城镁矿集团有限公司招聘64人笔试参考题库附带答案详解
- 蟠桃生意转让协议书
- DB21T 3532-2021 植保无人机释放赤眼蜂防治水稻二化螟技术规程
- 碳酸乙酯(碳酸二乙酯)的理化性质及危险特性表
- 模具保养记录表
- 三年级语文下册第七单元(集体备课)教材分析说课稿课件
- SAP零售行业解决方案
- 四川大学年《系统解剖学》期末试题及答案
- 博德之门BG+TOSC细节攻略
- 西南交通大学《行车组织》区段站工作组织课程设计(附大图)
- 正畸沙龙专用宣教PPT-口腔正畸正当时
- 阿帕套装汽车改灯灯光升级ppt课件
- 年产12.5万吨盐酸工程二段吸收工序工艺设计
评论
0/150
提交评论