您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 第6章面向对象程序设计课件
知识要点:1.I/O流----“领会”的层次。2.预定义的I/O流对象及运算符----“领会”的层次。3.文本模式的文件I/O----“简单应用”的层次。4.二进制模式的文件I/O----“简单应用”的层次。5.文件指针的使用----“领会”的层次。6.异常处理的概念----“领会”的层次。7.C++异常处理的实现----“简单应用”的层次。8.异常类----“领会”的层次。9.异常接口声明----“领会”的层次。第6章文件流和异常处理FileStreamandExceptionProcess6.1I/O流流(Stream),就是在计算机的各个部件之间传输数据的操作。所谓文件(File),一般是指以一定格式存储在外部介质上的一组相关数据的集合。文件流就是以外存文件作为输入输出对象的数据传输操作,利用它可以对文件进行读取、定位和写入等所有操作。流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。异常(Exception)就是非正常,当程序运行遇到非正常环境时,也能够对遇到的问题进行合理的人性化处理,而不能轻易出现死机或者其它灾难性后果,这就是程序设计中的异常处理。6.1I/O流6.1.1I/O流的概念及引入在C++中,输入输出操作是由“流”来处理的。在C++中,输入输出操作被定义为类,执行输入输出的类叫做流类,提供这些流类实现的系统库叫做流类库,而用具体流类定义的对象则称为流对象。在C++中,流是指数据流,它可以看作是一种既有数据,又有操作,并且与外部设备相联系的对象(流对象)。从流中获取数据的操作称为提取(输入)操作,向流中添加数据的操作称为插入(输出)操作,C++中为此专门定义了相应的提取运算符“”和插入运算符“”。C++为什么还要建立一套自己的I/O流类库呢?1、在C++中需要定义众多的用户自定义类型,但C语言的输入输出系统并不支持用户自定义对象。structmy_class{inti;floatf;char*str;}obj;对此结构体类型,在C语言中下面的语句是不能接受的:printf(“%my_class”,obj);-----------错误C语言不支持自定义类型数据的整体输入和输出(它只能一个一个成员单独处理);C++的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。6.1I/O流2、C的类型检查机制相对较弱。C++的编译系统加强了对数据类型的检查,提高了输入输出的安全性。在C语言中,用printf和scanf进行输入输出,往往不能保证输入输出的数据是可靠和安全的。在C++的I/O流中,编译系统对数据类型需要进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此C++的I/O操作是类型安全的。使用C++的I/O流类库,可以通过重载“”和“”运算符来解决自定义数据类型的输入和输出,并保证输入输出数据的可靠和安全。C++通过I/O流类库实现了丰富的I/O功能,因此C++的输入输出优于C语言中的printf()和scanf()系统函数。6.1I/O流6.1I/O流6.1.2I/O流的含义及层次(1)文件I/O流------从磁盘文件输入数据,或者输出数据到磁盘文件,以外存文件为对象的输入输出操作称为文件的输入输出流,简称文件I/O流。(2)标准I/O流------对系统指定标准设备的输入和输出,这种数据的流动称为标准的输入输出流,简称标准I/O流。(3)串I/O流------对内存中指定的空间进行输入和输出。这种输入和输出操作称为字符串输入输出流,简称串I/O流。C++采取不同的方法来实现以上各种输入输出。为了实现数据的有效流动,C++系统提供了庞大的I/O流类库,调用不同的类去实现不同的功能。6.1I/O流6.1.3预定义的I/O流对象及运算符1、预定义的I/O流对象C++中不仅定义了输入输出操作所需的流类,还预定义了几种流对象,它们都定义在iostream头文件中,分别是:(1)cin——标准输入流(流对象),与标准输入设备(在缺省情况下指键盘)相关联,它是istream_withassign类的对象。例如:cin变量名;“”为提取运算符,表示从键盘读取数据放入指定变量中。(2)cout——标准输出流(流对象),与标准输出设备(在默认情况下指显示器)相关联,它是ostream_withassign类的对象。例如:cout数据;“”为插入运算符,表示将“数据”写到屏幕上。(3)cerr——非缓冲型的标准出错流,与标准输出设备相关联,它是ostream_withassign类的对象。(4)clog——缓冲型的标准出错流,与标准输出设备相关联,它是ostream_withassign类的对象。6.1I/O流C++里的cout,cerr,clog都是ostream类定义的输出流对象,它们三者的区别如下:(1)cout是标准输出流对象,默认和显示器关联,cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl时,不论缓冲区是否满了,都立即输出流中所有数据。(2)cerr是无缓冲标准错误流对象,指定为和显示器关联,和cout的作用差不多,不同的是cout默认输出到显示器,但是可以被重定向输出到文件,而cerr流中的信息只能在显示器输出。并且cerr没有被缓冲,因而发送给它的任何内容都立即输出到标准设备。(3)clog是带缓冲标准错误流对象,作用和cerr一样,区别在于cerr输出时不经过缓冲区,直接向显示器输出信息,而clog中的信息则存放在缓冲区,当缓冲区满或者遇到endl时才输出。2、提取和插入运算符在C++中,“”和“”本来是被定义为右移运算符和左移运算符的,由于在iostream头文件中对它们进行了重载,使它们也能用作标准类型数据的提取(输入)和插入(输出)运算符了。在使用它们作为提取和插入运算符的程序中,必须用#include命令把iostream头文件包含到程序中。6.2文件的输入和输出从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,整数5678的存储形式占4个字节。二进制码文件(字节文件)是按二进制的编码方式来存放数据的。例如,整数5678的存储形式为:0001011000101110,它只占2个字节二进制码文件虽然也可在屏幕上显示,但其内容一般无法直接读懂。C++在处理二进制码文件时,把文件内容看成是字节流,按字节进行处理,输入输出字节流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。C++使用文件I/O流类对文件进行输入输出,ifstream类用来实现对文件的输入操作,ofstream类用来实现对文件的输出操作,fstream类用来实现对文件的输入和输出操作。6.2文件的输入和输出6.2.1fstream类fstream类既可用于将数据写入文件,也可用于读取文件的数据,因此往往比ifstream和ofstream更为常用。对文件的操作时,必须先包含头文件fstream。在C++中对文件进行读写操作一般应按如下步骤:(1)建立文件流对象;(2)调用open()函数打开或建立文件;(3)调用read()或write()函数对文件进行读写操作;(4)调用close()函数关闭文件。fstreamfsObj;fsObj.open(“e:\\c++\\data.txt”,ios::out);表示以输出模式打开e:\c++\data.txt文件,如果data.txt不存在,则自动创建。open函数的第一个参数指定了打开文件的路径和名字,此处使用的是绝对路径,当然也可使用相对路径。如果需要打开的文件就在当前程序所在的目录下,还可以省略路径,只写文件名即可。如果打开的文件及其路径都不存在,可以调用system()函数先创建该路径,然后再通过文件流打开文件的方式创建出文件。由于路径字符串中的反斜杠是转义字符,所以路径中的分隔符需要写成“\\”形式。6.2文件的输入和输出open函数的第二个参数指定将以何种模式打开文件,表6-1中列举了各种不同的打开模式模式参数功能ios_base::in文件打开为读取(输入)状态,此为istream类的默认模式参数ios_base::out文件打开为写入(输出)状态,此为ostream类的默认模式参数ios_base::ate打开一个现存文件,从文件结尾处读取(输入)或写入(输出)ios_base::app打开一个输出文件从文件结尾写入(输出)数据ios_base::trunc打开一个文件,如果它已经存在,就删除其中原有的内容ios_base::binary以二进制模式打开一个文件,默认是文本模式说明:(1)打开每个文件时都会有一个内置的文件指针指向文件内容:指针的开始位置由打开模式规定,未规定的情况下,文件指针指向文件的开始位置。每次读或写都从文件指针的指示位置开始,每读或写一个字节,指针就后移一个字节。读文件时,当文件指针移到文件末尾再次进行读操作时,成员函数eof()的返回值将为非0值,表示文件结束(2)用in方式打开文件只能用于读取数据,而且该文件必须已经存在,否则打开失败;用out方式打开文件只能用于写入数据,如果文件不存在,一般会自动创建该文件。(3)app的意思是append(追加),它只能用于输出,一般只能跟out方式一起使用。用app方式打开文件,打开时文件指针处于文件末尾,并且每次执行输出时,文件指针都在文件的末尾写入,就是在文件末端追加内容。6.2文件的输入和输出(4)ate的意思是attheend(在末尾),它既可以用于输入,也可用于输出。用ate方式打开文件时,文件指针自动移到文件末尾。如果ate、out和in模式一起使用,既可以直接将数据写入文件末尾,也可以通过seekg()或者seekp()更改文件指针的位置后,再读写文件的其它位置。在执行输入/输出的过程中,其文件指针可以自由控制。需要注意的一点就是,每次读之前需要调用seekg()函数设定文件指针读的位置,每次写之前需要调用seekp()函数设定文件指针写的位置。ate和app的相同点是:它们在打开文件的时候都会自动定位到文件的尾部,直接写入文件的话都是从文件尾开始,文件原来的内容不会被覆盖掉,新内容是追加到文件末尾的;ate和app的区别在于:app模式下每次写入的内容始终位于文件尾,文件指针写时不能由自己控制,而ate只是文件刚打开的时候文件指针指向文件尾,文件内容的读写位置要看文件指针的具体移动。(5)trunc的意思是truncate(截短),用trunc方式打开一个已存在的文件,当前文件的任何内容都将被舍弃,程序会假定打开的是一个长度为零的文件。相当于文件指针从文件开头重新写文件。6.2文件的输入和输出如果某个文件需要用两种或多种方式打开,则需要将多种模式组合在一起(模式之间用“|”进行分隔)。除了用open()成员函数打开文件,还可以用文件流类的构造函数来打开文件,其参数和默认值与open()函数完全相同。例如:fstreamioFsobj(“file.txt”,ios::in|ios::out);等价于fstreamioFsobj;ioFsobj.open(“file.txt”,ios::in|ios::out);表示以输入输出模式打开当前目录下的文件file.txt,刚打开时文件内置指针指向文件开头。如果文件打开失败,open函数的返回值为0,用构造函数打开的话,流对象的值为0。无论用哪一种方式打开文件,都最好在程序中测试文件是否打开成功,然后再决定是否能继续进行读写操作。6.2文件的输入和输出6.2文件的输入和输出打开文件后,就可调用read()和write()函数对文件进行读写操作了,在对文件读写
本文标题:第6章面向对象程序设计课件
链接地址:https://www.777doc.com/doc-2111269 .html