欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    (本科)第7章输入输出流类库ppt课件.ppt

    • 资源ID:15609090       资源大小:219.50KB        全文页数:86页
    • 资源格式: PPT        下载积分:30金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要30金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    (本科)第7章输入输出流类库ppt课件.ppt

    课程主讲人:第7章 输入输出流类库中国铁道出版社中国铁道出版社张思民等主编张思民等主编C+C+语言程序设计语言程序设计第 7 章 输入输出流类库本章内容本章内容n7.1 流的概念n7.1.1 什么是流n7.1.2 C+流类库n7.1.3 预定义流对象n7.2 重载提取和插入运算符n7.3 常用操作输入输出流的成员函数n7.4 文件n7.4.1 文件的概念n7.4.2 文件的打开与关闭n7.4.3 文本文件的读写操作n7.4.4 二进制文件读写操作n7.4.5 随机访问文件n7.5异常处理n异常的基本类型n异常处理方法n多个异常的处理方法n7.6 命名空间n7.7程序设计实例n本章小结7.1 流的概念7.1.1 什么是流 所所 谓谓 流流(stream),),就是字节的序列。通常把从数据存放地向内存传送数据称为输入流,其操作称为“读操作”。由于流是有方向的,所以只能从输入流中读取数据,而不能向它写数据。如图7.1所示。图7.1从输入流中读取数据到内存 同样,把从内存向数据目的地传送数据称为输出流,其操作称为“写操作”。 输出流只能向该流写入数据,而不能从该流中读取数据。如图7.2所示。图7.2从内存向输出流写数据 流是一个抽象的概念,其职责是在数据的产生者和数据的使用者之间建立联系,并负责管理数据的流动。 7.1.2 C+流类库 C+语言中把对流的描述和对流的操作都定义为类,这些类统称为流类。流类主要由两个流类结构组成,一个是以streambuf 类为基类的类结构层次,另一个是以ios类为基类的类结构层次。其它流类都是从这两个基类派生的,流类已经构成了一个庞大的类库。1、streambuf 类层次结构类层次结构streambuf 类为所有的 streambuf 类层次对象设置了一个固定的内存缓冲区,该内存缓冲区能动态地划分成用做数据输入的读取区和用做数据输出的存放区,这两个区可以重叠也可以不重叠。读取区定义了一个指示当前读取数据位置的读取指针,存放区定义了一个指示当前存放数据位置的存放指针。 filebuf类扩展了streambuf 类的文件处理功能,用于文件流与文件缓冲区相关联,实现对文件缓冲区中的字节序列的读写操作:(1)写文件:将缓冲区的内容按字节写到指定的文件中,然后刷新缓冲区。(2)读文件:交指定文件的内容按字节读到缓冲区中。(3)打开文件:使filebuf对象与被读或写的文件相关联。(4)关闭文件:交filebuf对象与被读或写文件的关联解除。 filebuf类使用文件来保存缓冲区中的字符序列。当写文件时,是把缓冲区中的数据序列写到某个指定文件中;当读文件时,是把某个指定文件中的数据序列读到缓冲区中。2、ios 类层次结构类层次结构ios类是一个抽象类,类是一个抽象类,ios 类层次中各类的含义如表类层次中各类的含义如表7-1所示。所示。 类名含义ios根基类istream输入流类ostream输出流类iostream输入输出流类ifstream输入文件流类ofstream输出文件流类fstream输入输出文件流类istrstream输入字符串流类ostrstream输出字符串流类strstream输入输出字符串流类7.1.3 预定义流对象n在iostream类中定义了4个流对象: cin、cout、cerr、clog。把这4个流对象称为预定义的流对象。这 4 个流对象所关联的具体设备为:ncin 是 istream 的标准输入流对象,用于处理标准输入,与标准输入设备相关联;ncout 是 ostream 的标准输出流对象,用于处理标准输出,与标准输出设备相关联;ncerr 是 ostream 的非缓冲型的标准出错流对象,用于处理标准错误信息,与标准错误输出设备相关联(非缓冲方式)。nclog 是 ostream 的缓冲型标准出错流对象,用于处理标准错误信息,与标准错误输出设备相关联(缓冲方式)。预定义流的含义如表7-2所示。流含义cin对应于标准输入设备(键盘)。cout对应于标准输出设备(显示器)。cerr对应于标准错误输出设备,它是非缓冲输出。clog对应于标准错误输出设备,但它与cerr不同,它的输出是缓冲输出。7.2 重载提取和插入运算符C+流通过重载运算符流通过重载运算符“”执行输入和输出的操作。执行输入和输出的操作。1、预定义的插入运算符在C+中,输出操作称为插入,“”称为插入运算符。在第2章中已经介绍,“”运算符是C+中的逐位左移运算符,在这里,此运算符被重载,用于流的输出操作。预定义的插入运算符“”作用于流对象cout上,用于输出操作。操作格式为:操作格式为:cout cout 操作数;操作数;【例【例7-1】重载插入运算符进行屏幕输出。】重载插入运算符进行屏幕输出。 n#include nusing namespace std;nvoid main()nnint a = 8;nfloat b = 5.5;ndouble c = 78.9;nchar *str = C+确实很神奇确实很神奇!;ncout a = a endl;ncout b = b endl;ncout c = c endl;ncout str = str ”运算符是C+中的逐位右移运算符。在这里,此运算符被重载,用于流的输入操作,称为“提取运算符”。提取运算符“”作用于流对象cin上,用于输入操作。其操作格式为:其操作格式为:cin cin 操作数;操作数;【例【例7-2】重载提取运算符从键盘输入数据。】重载提取运算符从键盘输入数据。n#include nusing namespace std;nvoid main()nnint i;nfloat j;nchar str10;ncout i j;ncout str;ncout i = i endl;ncout j = j endl;ncout str = str endl;n请依次输入一个整数和一个小数: 2 4.5 请输入一个字符串: 面向对象程序设计 i = 2j = 4.5str = 面向对象程序设计7.3 常用操作输入输出流的成员函数1、输出流的成员函数、输出流的成员函数(1)put函数函数该函数把一个字符写到输出流中。这个函数带有一个参数:put(char ch)put(char ch);下面二条语句的作用是相同的:cout.put(a); /向屏幕精确地输出一个字符cout ”很相似,其主要区别是get函数在读取数据时可以包含空白字符,而提取运算符“”是拒绝空白字符的。get函数的原型有三种方式:get();或:get(char ch);或:get(char *buffer, int n, char ch);nget();不带参数,从指定的输入流中提取一个字符。nget(char ch);带一个参数,从输入流中读取一个字符,并存放到变量ch中。nget(char *buffer, int n, char ch);带有三个参数,第一个参数是字符型指针,指向字符串存放区的首地址,第二个参数是字符串的大小,第三个参数为指定的终止符,默认值为“n”。(2)getline函数函数该函数的功能与get(char *buffer, int n, char ch)相似,允许从输入流中读取多个字符,并且允许指定终止符(默认值是换行符),在完成读取数据后,从读取的数据中删除该终止符。其函数原型为:其函数原型为:getlinegetline(char char * *buffer, int n, char ch = nbuffer, int n, char ch = n););(3)read 函函 数数该函数可以从输入流中每次读取一行字符,其函数原型为:readread(char char * *buffer, int sizebuffer, int size););其中,第一个参数是字符型指针,指向字符序列存入区的首地址,第二个参数是字符序列的总字符数上限。7.4 文 件7.4.1 文件的概念1、文件、文件在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名。一个文件名由文件主名和扩展名两部分组成。文件主名和文件扩展名都是C+的标识符,通常用文件扩展名来区分文件的类型。如在C+系统中,用扩展名.h表示头文件,用扩展名 .cpp 表示程序文件,用 .obj 表示程序文件被编译后生成的目标文件,用 .exe 表示连接整个程序中所有目标文件后生成的可执行文件。对于用户建立的用于保存数据的文件,经常用 .dat 表示扩展名,若是文本文件则也用 .txt 作为扩展名。2、字符文件和字节文件、字符文件和字节文件在C+程序中使用的保存数据的文件按存储格式分为两种类型:一种为字符文件,另一种为字节文件。字符文件又称ASCII码文件或文本文件。在字符文件中,每个字节单元的内容为字符的ASCII码,被读出后能够直接送到显示器或打印机上显示或打印出对应的字符,供人们直接阅读。字节文件又称为二进制文件。在字节文件中,文件内容是数据的内部表示,是从内存中直接复制过来的。3、文件的读写操作和文件流类型、文件的读写操作和文件流类型无论是字符文件还是字节文件,在访问它之前都要定义一个文件流类的对象,并用该对象打开它,以后对该对象的访问操作就是对被它打开文件的访问操作。对文件操作结束后,再用该对象关闭它。对文件的访问操作包括输入和输出两种操作,输入和输出是相对于CPU来说的,输入操作是指从外部文件读取数据,输出操作是指把内存变量或表达式的值写入到外部文件中。对文件的操作是由文件流类完成的。文件流类在流与文件之间建立连接,使用这些文件流类必须用 #include 编译命令将头文件 fstream 包含进来。文件流分为输入文件流、输出文件流、输入输出文件流三种类型,它们对应的类为:输入流类ifstream;输出流类ofstream;输入输出文件流类fstream。4、文件流对象的文件操作成员函数、文件流对象的文件操作成员函数函数原型操作说明get(char &ch)从文件中读取一个字符getline(char *pch, int count, char delim = n)从文件中读取多个字符,读取个数由参数count决定,delim为指定读取的结束符,通常是换行符read(char *pch, int count)从文件中读取多个字符,读取个数由count决定put(char ch)向文件写入一个字符write(const char *pch, int count)向文件写入多个字符,字符个数由参数count决定open(const char *filename,int mode)按mode方式打开文件eof( )函数返回值为0,文件中还有数据可读,返回值为非0值(通常为-1),文件指针指向文件末尾gcount( )获得实际读取的字节数seekg(流中的绝对位置);绝对移动,适用于输入流操作seekg(偏移量, 参考位置);相对操作,适用于输入流操作tellg();返回当前指针位置,适用于输入流操作seekp(流中的绝对位置);绝对移动,适用于/输出流操作seekp(偏移量, 参考位置);相对操作,适用于/输出流操作tellp();返回当前指针位置,适用于/输出流操作close( )关闭文件5、文件地址及返回值、文件地址及返回值 一个文件中保存的内容是按字节从数值0开始顺序编址的,文件开始位置的字节地址为0,文件内容的最后一个字节的地址为n-1(假定文件长度为n,即文件中所包含的字节数),文件最后存放的文件结束符的地址为n,它也是该文件的长度值。当一个文件为空时,其开始位置和最后位置(即文件结束符位置)同为0地址位置。 对于每个打开的文件,都存在着一个文件指针,初始指向一个隐含的位置,该位置由具体打开方式决定。每次对文件写入或读出信息都是从当前文件指针所指的位置开始的,当写入或读出若干个字节后,文件指针就后移相应多个字节。当文件指针移动到最后,读出的是文件结束符时,则将使流对象调用eof( )成员函数返回值为-1,当然读出的是文件内容时将返回0。文件结束符占有一个字节,其值为-1,在ios类中把EOF常量定义为-1。若利用字符变量依次读取字符文件中的每个字符,当读取到的字符等于文件结束符EOF时则表示文件访问结束。7.4.2 文件的打开与关闭1、文件的打开、文件的打开n要在程序中对文件进行读写操作,必须先打开文件。只有文件被打开后,才能对文件进行读写操作。打开文件就是使一个文件流对象与一个指定的文件相关联。n打开文件的方法有两种,一种是用文件流对象的成员函数open( )打开文件,另一种是用文件流对象的构造函数打开文件。(1)先建立相应的文件流对象,再用文件流对象的成员函数open( )打开一个文件:由输入流类ifstream建立输入文件流对象。例如:ifstream f_read;由输出流类ofstream建立输出文件流对象。例如:ofstream f_write;输入输出文件流类fstream建立输入输出文件流对象。例如:fstream f_wr;三种文件流类对象都有open( ) 成员函数并且具有完全相同的声明格式,具体声明格式为:具体声明格式为:流类对象名;流类对象名; 对象名对象名.open(文件名文件名, 打开模式打开模式); 其中:其中:流类为ifstream、ofstream或fstream三种流类之一。文件名可以带有盘符和路径名,若省略盘符和路径名则隐含为当前盘和当前路径。(2)通过文件流对象的构造函数打开文件:)通过文件流对象的构造函数打开文件:打开方式用于指定打开文件的模式,对应的实参是ios类中定义的open_mode枚举类型中的符号常量。open_mode枚举类型中的符号常量含义如表7.4所示。流类对象名流类对象名(文件名文件名, 打开打开模式模式);打开方式含义ios:in 打开用于数据输入的文件,即从文件中读取数据。ios:out 打开用于数据输出的文件,即向文件写入数据。ios:ate 使文件指针移至文件尾,即最后位置。ios:app 使文件指针移至文件尾,并只允许在文件尾部追加数据。ios:trunc 若打开的文件存在,则清除其全部内容,使之变为空文件。ios:binary文件以二进制方式打开,缺省时以文本文件打开。表7.4文件打开模式的符号常量含义 2、文件打开模式、文件打开模式 (1) 文件的打开模式可以为多个符号常量用按位或运算“|”的组合。如: ios:in | ios: binary /按只读方式打开二进制文件。 ios:in | ios:out /按读写操作方式打开文件。 ios:in | ios:out | ios:binary /按读写操作方式打开二进制文件。(2) 使用open()函数打开一个文件时,若所指定的文件不存在,则就新建一个文件,当然新建立的文件是一个长度为0的空文件,但若打开方式参数中包含有ios:in选项,则不建立新文件,并且返回打开失败信息。2、文件打开文件打开模式模式(3) 当打开方式中不包含ios:ate或ios:app选项时,则文件指针被自动移到文件的开始位置,即字节地址为0的位置。当打开方式中包含有ios:out选项,但不包含ios:in、ios:ate或ios:app选项时,若打开的文件存在,则原有内容被清除,使之变为一个空文件。(4) 当用输入文件流对象调用open()函数打开一个文件时,打开方式参数可以省略,缺省按ios:in方式打开,若打开方式参数中不含有ios:in选项时,则会自动被加上。当用输出文件流对象调用open()函数打开一个文件时,打开方式参数也可以省略,缺省按ios:out方式打开,若打开方式参数中不含有ios:out选项时,则也会自动被加上。(1) ofstream f_write; f_write.open(“c:ook.dat”); (2) ifstream f_read; f_read.open(“c:wr.dat”, ios:in);(3) ofstream f_out; f_out.open(“c:ook.dat”, ios:app);(4) fstream f_wr; f_wr.open(“c:abc.bin”, ios:in | ios:out | ios:binary);下面是定义文件流对象和打开文件的一些示例:对于上述给出的四个例子,可以通过构造函数打开文件,即把声明对象和打开文件合并成一步进行: (1) ofstream f_write(“c:ook.dat”); (2) ifstream f_read(“c:wr.dat”, ios:in); (3) ofstream f_out(“c:ook.dat”, ios:app); (4) fstream f_wr(c:abc.bin”, ios:in | ios:out | ios:binary);3、文件是否成功打开的判断、文件是否成功打开的判断文件打开后,应判断打开是否成功。若不成功,则后续的文件读/写操作就没有实际意义。因在ios类中重载了取反运算符“!”,返回非0值。我们可以利用这一点检测文件打开是否成功。例如,设f_read为输入文件流对象,且调用open( )成员函数打开一个文件,则可用(!f_read)是否为真判断打开文件是否失败。 ifstream f_readifstream f_read;f_read.open(“f_read.open(“文件路径及文件名文件路径及文件名”) );if(!f_read)if(!f_read) exit(1)exit(1); (后续文件操作语句后续文件操作语句) );若文件打开成功,则若文件打开成功,则“! f_read”为为0,否则,否则“! f_read”为为 非非 0 值。值。此处判断条件亦可直接写成:此处判断条件亦可直接写成:f_read.fail( )即即if(f_read.fail( ) exit(1); 4、 文件的关闭文件的关闭关闭任何一个流对象所对应的文件,就用这个流对象调用close()成员函数即可。流对象名流对象名.close( ).close( );7.4.3 文本文件的读写操作读写操作可分为文本文件的读写与二进制文件的读写两种方式,按数据存取方式的不同,读写操作可分为顺序读写及随机读写两种方式。1、 向文本文件写入数据向文本文件写入数据向文件写入数据,即从内存向文件输出数据,需要使用输出流类。向文本文件输出数据有两种方法,一种是调用从ostream流类中继承来的插入操作符重载函数“”,另一种是调用从ostream流类中继承来的put()函数。【例例7-8】计算从计算从1加到加到10,并将计算过程保存到文件,并将计算过程保存到文件data1.dat中。中。n#include n#includenusing namespace std;nvoid main(void)nn int s = 0;n ofstream fileout(data1.dat); /定义输出文件流,并打开相应文件n if (!fileout)n /当fileout打开失败时进行错误处理n cerrdata1.dat file not open!endl;n exit(1);n n for(int i = 0; i 11; i+)n fileout i + 1 = i + 1 endl; ncout 向文件data1.dat写入数据成功! ”,每次从文件流中提取用空白符隔开(当然最后一个数据以文件结束符为结束标志)的一个数据,这同使用提取操作符从cin流中读取数据的过程和规定完全相同,在读取一个数据前文件指针自动跳过空白字符,向后移到非空白字符时读取一个数据。(2)第二种是调用get()函数,每次从文件流中提取一个字符(不跳过任何字符,当然回车和换行两个字符被作为一个换行字符看待)并作为返回值返回,或者调用get(char&)函数,每次从文件流中读取一个字符到引用变量中,同样不跳过任何字符。(3)第三种是调用getline(char* buffer, int len, char=n)函数,每次从文件流中读取以换行符隔开(当然最后一行数据以文件结束符为结束标志)的一行字符到字符指针buffer所指向的存储空间中,若碰到换行符之前所读取字符的个数大于等于参数len的值,则本次只读取len-1个字符,被读取的一行字符是作为字符串写入到buffer所指向的存储空间中的,也就是说在一行字符的最后位置必须写入0字符。istreamistream& operator( operator( 简单类型简单类型& ); );int get();int get();istreamistream& get(char get(char&); ); istreamistream& getline(char getline(char* * buffer, int len, char=n); buffer, int len, char=n);【例例7-10】 将一字符串写将一字符串写入到文本文件入到文本文件data3.dat文文件中,件中, 然后读取数据显示然后读取数据显示到屏幕上。到屏幕上。void main()ofstream fileout(data3.dat,ios:out); if (!fileout) cerr 文件文件data3.dat 打开失败打开失败! endl; exit(1); fileout Hello, C+! n x) cout x ; coutendl; fileread.close(); 【例例7-11】 复制一个文件到另复制一个文件到另一个目标文件。一个目标文件。nvoid main()nn char ch;n ifstream f_in(data3.dat, ios:in);n ofstream f_out(data4.dat,ios:out); n if (!f_in) /当文件打开失败时进行错误处理n n cerr 源文件data3.dat 打开失败! endl;n exit(1);n n if (!f_out) /当文件打开失败时进行错误处理n n cerr 目标文件data4.dat 打开失败! endl;n exit(2);n n while( f_in.get(ch) ) f_out.put(ch);n f_in.close();n f_out.close();n cout 文件复制完毕! endl;n 【例例7-12】使用成员函数使用成员函数read( )和和write( )读写文件。读写文件。void main() char *s1=春花秋月何时了,春花秋月何时了,;char *s3=往事知多少?往事知多少?;char *s2=n; /换行符换行符 ofstream f_write(data2.dat); if(!f_write) cout 打开写入文件失败!打开写入文件失败! endl; exit(1); f_write.write(s1, strlen(s1).write(s2, strlen(s2).write(s3, strlen(s3); f_write.close(); ifstream f_read(data2.dat); if(f_read.fail() ) cout 不能打开读取文件:不能打开读取文件:data2.datn endl; exit(1); char x; while(!f_read.eof() ) f_read.read(char *)&x, sizeof(x); cout x ; f_read.close(); 7.4.4 二进制文件的读写操作二进制文件的读写操作在打开二进制文件时要在open( )函数中加上ios:binary方式作参数,即表示采用二进制格式进行文件流的读或写。一般地,对二进制文件的读写操作可以采用两种方法:一种是用get( )函数读数据,用put( )函数写数据;另一种是用read( )函数读数据,用write( )函数写数据。【例例7-13】编写一个复制文件类,将图像文件编写一个复制文件类,将图像文件a.jpg复制为复制为b.jpg。class copyFile private: char b25000; public:void readfile(char *oldfile); void writefile(char *newfile);算法分析:算法分析:由于图像是二进制文件,因此,在处理图像文件时需要以二进制形式打开文件。另外,设图像文件的大小为22K字节,则定义存放数据的数组容量应大于22K。void copyFile : readfile(char *oldfile) ifstream rfile(oldfile, ios:binary); /建立文件到输入流的连接对象 rfile.read(b,25000); /读取文件数据到数组b中 cout read OK! endl; rfile.close(); /(2) 从数组中将数据写入文件b.jpg void copyFile : writefile(char *newfile) ofstream wfile(newfile, ios:binary); /建立输出流到文件的连接对象 wfile.write(char *)&b, sizeof(b); /将数组中的数据写入输出流 cout write OK! endl; wfile.close(); void main()copyFile cpfile;char *oldfilename = a.jpg;char *newfilename = b.jpg; cpfile.readfile(oldfilename); cpfile.writefile(newfilename);【例例7-14】创建一个学生类,建立记录学生成绩数据的二进制文件。创建一个学生类,建立记录学生成绩数据的二进制文件。class Student /定义学生类定义学生类private:public:char *name;char *kemu;double chenji;Student(char *name1, char *km, double cj) name= name1; kemu = km; chenji = cj; ;void main()Student dat(张大山, 程序设计, 95); /定义对象ofstream f_out(data.dat, ios:binary); /建立二进制输出文件流f_out.write(char *)&dat, sizeof(dat); /向文件流写入数据f_out.close(); ifstream f_in(data.dat, ios:binary); /建立二进制输入文件流 f_in.read(char *)&dat, sizeof(dat); /从文件流读取数据cout 姓名 课程 成绩 endl;cout dat.name dat.kemu dat.chenji endl; f_in.close();7.4.5 随机访问文件随机访问文件 随机访问文件是指从指定的位置开始读写文件。实际上,随机访问文件方式处理文件的方法,只是在前面关于顺序文件处理方法的基础上,增加文件指针定位处理就可以了。文件指针参照位置有文件指针参照位置有3种情况:种情况:(1)ios:beg 文件开始处,换算的位置值为0(2)ios:cur文件当前位置(3)ios:end文件末尾处,换算的位置值为文件长度移动读写指针的方法有两种,一是直接将指针移到指定的位置,二是在某个参照位置的基础上,将指针移动一定的偏移量。C+ 提供了2个文件指针定位处理的成员函数:seekg( ) 函数将文件的“读”指针移到指定的位置。seekp( ) 函数将文件的“写”指针移到指定的位置。这两个函数最常用的形式为:这两个函数最常用的形式为: istream seekg(流中的位置); ostream seekp(流中的位置); 或: istream seekg(偏移量, 参照位置); ostream seekp(偏移量, 参照位置) ;【例例7-15】使用输入输出文件流建立记录使用输入输出文件流建立记录3个学生成绩数据的二进制文件。个学生成绩数据的二进制文件。class Student /定义学生类定义学生类private:public:char *name;char *kemu;double chenji;Student(char *name1, char *km, double cj) name= name1; kemu = km; chenji = cj;void main()Student std1(张大山, 程序设计, 95); /定义对象Student std2(王新霞, 程序设计, 82);Student std3(李季平, 程序设计, 78); /打开输入输出文件 fstream datafile(data.dat,ios:in|ios:out|ios:binary); datafile.write(char *)&std1, sizeof(std1); /向文件流写入数据datafile.write(char *)&std2, sizeof(std2);datafile.write(char *)&std3, sizeof(std3);datafile.seekg(ios:beg); datafile.read(char *)&std1, sizeof(std1); /从文件流读取数据datafile.read(char *)&std2, sizeof(std2);datafile.read(char *)&std3, sizeof(std3);cout 姓名 课程 成绩 endl;cout std1.name std1.kemu std1.chenji endl;cout std2.name std2.kemu std2.chenji endl;cout std3.name std3.kemu std3.chenji endl; datafile.close();【例例7-16】建立记录建立记录3个学生成绩数据的二进制文件,再从文件中读出第个学生成绩数据的二进制文件,再从文件中读出第2个学生的数据。个学生的数据。class Student /定义学生类定义学生类 public:char *name;char *kemu;double chenji;void set_data(char *name1, char *km, double cj) name= name1; kemu = km; chenji = cj;void main()Student std3, std2; /定义对象定义对象 /打开输入输出文件打开输入输出文件 fstream datafile(data.dat,ios:in|ios:out|ios:binary); std0.set_data(张大山张大山, 程序设计程序设计, 95);std1.set_data(王新霞王新霞, 程序设计程序设计, 82);std2.set_data(李季平李季平, 程序设计程序设计, 78); for(int i = 0; i = 2; i+) datafile.write(char *)&stdi, sizeof(stdi); /向文件流写入数据向文件流写入数据datafile.seekg(1*sizeof(std0),ios:beg); datafile.read(char *)&std2, sizeof(std2);cout 姓名姓名 课程课程 成绩成绩 endl;cout std2.name std2.kemu std2.chenji endl; datafile.close();7.5异常处理异常的基本类型常见的异常情况一般分为以下几类: (1)用户输入错误。 (2)设备故障。 (3)物理限制。 (4)代码错误。异常处理方法1、异常处理机制、异常处理机制异常处理机制的基本思想是将异常的检测与处理分离。基本方法是:当程序中出现异常时抛出异常,用来通知系统发生了异常,然后由系统捕捉异常,并交给预先安排的异常处理程序段来处理异常。这样的异常处理机制,可以实现在两个或两个以上的程序模块间传递异常信息,从而可以使程序设计人员根据问题的要求,在不同的情况下灵活地处理各种异常。 2、异常处理方法、异常处理方法异常处理过程主要有三个步骤:抛出异常,捕捉异常和处理异常。对应各个步骤的关键字分别是:throw、try 和 catch。异常信息的识别和传递是通过程序中定义的异常类来完成的。把需要监测异常情况的程序语句包含在一个try 块中,如果 try 块中出现异常,该异常就会被throw抛出,利用catch可以捕获并处理异常。如图7.5所示。 (1)捕捉异常try 块的语法格式try ; ; 可能出现异常的复合语句(2)处理异常catch 的语法格式catch(异常类型) ;异常处理语句(3)throw 的语法格式的语法格式当程序中发现了自己不能处理的异常,就可以使用 throw语句将异常抛出给调用者。throw的表达式与return中的表达式相似,如果程序中有多处异常被抛出,应该用不同的表达式类型来加以区别。 throwthrow表达式;表达式;3、 异常处理的应用异常处理的实现步骤如下: (1)定义 try 语句块,将有可能产生错误的语句包含在 try 语句块中; (2)定义 catch 语句块,将异常处理的语句放在块中,以便异常被传递过来时就处理它; (3)抛出异常 throw 语句,检测是否产生异常,若是,则抛出异常。 多个异常的处理方法try try ; throw (throw (异常表达式异常表达式) ) catchcatch(异常类(异常类 1 1) ; catchcatch(异常类(异常类 n n) ; 7.6命名空间命名空间是对各种类型的命名进行层次规划的方式,它实际上提供了一种命名机制,同时也是程序进行逻辑组织的方式。命名空间是一些类的松散的集合,一般不要求处于同一命名空间中的类是有明确的相互关系,如包含、继承等。为了方便程序设计和管理,通常把需要在一起工作的类放在一个命名空间中。关键字关键字namespace 用于声明一个命名空间,声明的方式如下:用于声明一个命名空间,声明的方式如下:namespace 命名命名 类型声明类型声明命名空间中的命名可以由一个标识符,或者是由多个用双冒号 “:” 分开的多个标识符,例如:SunCorp:Person:Oldperson。7.7程序设计实例【例【例7-20】文件压缩与解压。】文件压缩与解压。1、问题描述:、问题描述:通过压缩文件的程序,将一个文件压缩成一个新文件,该过程称为压缩,新文件称为压缩文件。压缩文件比原文件要小,并且压缩文件的程序能够使新文件(压缩文件)还原为原文件,该过程称为解压缩。2、算法分析:、算法分析:压缩文件的方案有很多,这里介绍一种较为简单的方法。设要压缩的文件是由二种数字组成的一幅图像,如图7.6所示。图7.6要压缩的文件是由二种数字组成的一幅图像下面考虑压缩的编码方案为:(1)按重复出现的数字的次数代替原文件中重复的部分。例如:由于依次出现5个0、4个1、7个0、4个1和5个0。因此可以用54745来表示这个数据。新的编码比原来的要短,也就是说,对原码进行了压缩。(2)在对被压缩的数据进行解压缩,只需进行一次逆向操作。例如:编码为1385812其数据被解压缩为其数据被解压缩为2、算法设计:、算法设计:(1)读取文件数据,用一个char类型的二维数组strij来处理文件数据。图像文件的数据共有30行,每行60个数字,因此,设const int H = 30, L = 60;char strHL;for(i = 0; i H; i+) for(j = 0; j xij; (2)压缩文件(编码)压缩文件

    注意事项

    本文((本科)第7章输入输出流类库ppt课件.ppt)为本站会员(春哥&#****71;)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开