




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章流类库和输入/输出,本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。C+语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C+标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。,第九章流类库和输入/输出,9.1C+的基本流类体系,9.3标准设备的输入/输出,9.2输入输出的格式控制(选读),9.4文件的输入与输出,9.5字符串流(选读),9.6文件与对象,9.1C+的基本流类体系,流类体系:以抽象类模板basic_ios为基类,流类模板派生体系见图9.1。整个流类模板体系的标准I/O在头文件中说明,包含头文件、和。而输入输出文件流部分在头文件中说明。,图9.1主要输入/输出流模板层次,9.1C+的基本流类体系,basic_ios类模板提供了对流进行格式化输入输出和错误处理的成员函数。所有派生都是公有派生。basic_istream类模板提供完成提取(输入)操作的成员函数,而basic_ostream类模板提供完成插入(输出)操作的成员函数。basic_iostream类是前两者的聚合,并没有增加成员。派生全部为公有派生。,basic_streambuf不是basic_ios的派生类,而是一个独立的类,只是basic_ios有一个保护访问限制的指针指向它。类basic_streambuf的作用是管理一个流的缓冲区。,*从技术上讲,模板并不能派生其他模板。但是这些模板只是预先定义了数据类型(如char或wchar_t等等)的模板实例,这些实例都是类,所以可以继承。,流类体系说明:,9.1C+的基本流类体系,标准输入/输出流对象:在C+的流类库中定义了四个全局流对象:cin,cout,cerr和clog。可以完成人机交互的功能。cin标准输入流对象,键盘为其对应的标准设备。cout标准输出流对象,显示器为标准设备。cerr和clog标准错误输出流,输出设备是显示器。其中cin、cout和clog是带缓冲区的,缓冲区由streambuf类对象来管理。而cerr为非缓冲区流,一旦错误发生立即显示。要使用这四个功能,必须包含文件。,9.1C+的基本流类体系,重载的提取运算符“”(stream_extractionoperator)和插入运算符“和”或“”和“”或“”的左操作数;第二个参数为用户定义类的引用,作为右操作数,流用作函数参数,必须是引用调用,不能是传值调用。,【例9.5】改进【例6.10】,重载插入运算符“”。【例9.6】用户定义的复数类Complex的输入与输出。,9.4文件的输入与输出,本节中文件指的是磁盘文件。C+根据文件(file)内容的数据格式,可分为两类:二进制文件和文本文件。文本文件由字符序列组成,也称ASCII码文件,在文本文件中存取的最小信息单位为字符(character),而二进制文件中存取的最小信息单位为字节(Byte)。,C+把每一个文件都看成一个有序的字节流,见图9.3,每一个文件或者以文件结束符(endoffilemarker)结束,或者在特定的字节号处结束。,文件的基本概念:,9.4文件的输入与输出,当打开一个文件时,该文件就和某个流关联起来了。对文件进行读写实际上受到一个文件定位指针(filepositionpointer)的控制。输入流的指针也称为读指针,每一次提取操作将从读指针当前所指位置开始,每次提取操作自动将读指针向文件尾移动。输出流指针也称写指针,每一次插入操作将从写指针当前位置开始,每次插入操作自动将写指针向文件尾移动。,9.4.1文件的打开与关闭,9.4.2文本文件的读写,9.4.3二进制文件的读写,9.4.4文件的随机访问(选读),9.4.1文件的打开与关闭,文件使用步骤:1说明一个文件流对象,这又被称为内部文件:ifstreamifile;/只输入用ofstreamofile;/只输出用fstreamiofile;/既输入又输出用,9.4.1文件的打开与关闭,2使用文件流对象的成员函数打开一个磁盘文件。这样在文件流对象和磁盘文件名之间建立联系。文件流中说明了三个打开文件的成员函数。voidifstream:open(constchar*,int=ios:in,int=filebuf:openprot);voidofstream:open(constchar*,int=ios:out,int=filebuf:opernprot);voidfstream:open(constchar*,int,int=filebuf:openprot);第一个参数为要打开的磁盘文件名。第二个参数为打开方式,有输入(in),输出(out)等,打开方式在ios基类中定义为枚举类型。第三个参数为指定打开文件的保护方式,一般取默认。所以第二步可如下进行:iofile.open(“myfile.txt”,ios:in|ios:out);,9.4.1文件的打开与关闭,三个文件流类都重载了一个带默认参数的构造函数,功能与open函数一样:ifstream:ifstream(constchar*,int=ios:in,int=filebuf:openprot);ofstream:ofstream(constchar*,int=ios:out,int=filebuf:openprot);fstream:fstream(constchar*,int,int=filebuf:operprot);所以1,2两步可合成:fstreamiofile(”myfile.txt”,ios:in|ios:out);,9.4.1文件的打开与关闭,打开文件也应该判断是否成功,若成功,文件流对象值为非零值,不成功为0(NULL),文件流对象值物理上就是指它的地址。因此打开一个文件完整的程序为:fstreamiofile(”myfile.txt”,ios:in|ios:out);if(!iofile)/“!”为重载的运算符,见9.3.1节cout”不能打开文件:”myfile,txt”)和插入运算符()进行。【例9.7】复制文件。【例9.8】按行复制文本文件。【例9.9】文本式数据文件的创建与读取数据。资源获取是由构造函数实现,而资源释放是由析构函数完成。所以与内存动态分配一样,由文件重构对象放在构造函数中,把对象存入文件则放在析构函数中。参见9.6节。,9.4.3二进制文件的读写,对二进制文件进行读写的成员函数:istream/第一个参数指定输出对象的内存地址,/第二个参数指定插入的字节数,/函数从该地址开始将指定数量的字节插入输入输出流,9.4.3二进制文件的读写,文件结束判断:读函数并不能知道文件是否结束,可用状态函数intios:eof()来判断文件是否结束。必须指出系统是根据当前操作的实际情况设置状态位,如需根据状态位来判断下一步的操作,必须在一次操作后立即去调取状态位,以判断本次操作是否有效。,【例9.10】创建二进制数据文件,以及数据文件的读取。这两项操作设计为成员函数。给出与【例9.9】不同的读写方式:,9.4.3二进制文件的读写,二进制文件优点:可以控制字节长度,读写数据时不会出现二义性,可靠性高。同时不知格式是无法读取的,保密性好。文件结束后,系统不会再读(见eofbit的说明),但程序不会自动停下来,所以要判断文件中是否已没有数据。如写完数据后没有关闭文件,直接开始读,则必须把文件定位指针移到文件头。如关闭文件后重新打开,文件定位指针就在文件头。,9.4.4文件的随机访问(选读),文件的随机访问:在C+中可以由程序控制文件指针的移动,从而实现文件的随机访问,即可读写流中任意一段内容。一般文本文件很难准确定位,所以随机访问多用于二进制文件。如【例9.9】中对象中两个字符串是按实际串长存放的,不是按数组元素来存放的,而【例9.10】中是按数组长度来存放的,每个对象数据长度固定,所以便于随机访问。,在ios类中说明了一个公有枚举类型:enumseek_dirbeg=0,/文件开头cur=1,/文件指针的当前位置end=2/文件结尾;,随机访问指针控制字:,9.4.4文件的随机访问(选读),输入流指针控制字设置成员函数:istream/表示将文件定位指针从文件尾向文件头方向移20个字节。tellg()和seekg()往往配合使用。/指针不可移到文件头之前或文件尾之后。,9.4.4文件的随机访问(选读),输入流指针控制字设置成员函数:ostream为了便于记忆,函数名中g是get的缩写,而p是put的缩写。对输入输出文件定位指针只有一个但函数有两组,这两组函数功能完全一样。,【例9.11】使用随机访问对【例9.10】进行改造。,9.5字符串流(选读),字符流概念:字符串(string)也可以看作字符流。可以用输入输出操作来完成串流的操作。串流与内存相关,所以也称内存流。串流类包括ostrstream、istrstream、strstream,它们在中说明。串流类对象可以保存字符,也可以保存整数、浮点数。串流类对象采用文本方式。其构造函数常用下面几个:istrstream:istrstream(constchar*str);istrstream:istrstream(constchar*str,int);ostrstream:ostrstream(char*,int,int=ios:out);strstream:strstream(char*,int,int);其中第二个参数说明数组大小,第三参数为文件打开方式。,【例9.12】,9.6文件与对象,在面向对象的C+程序设计中,文件应该在构造函数中打开,并创建对象;而在析构函数中保存和关闭文件,并撤销对象。当撤销对象时,能自动释放资源。释放资源包括将对象中的信息再次存入磁盘文件。程序运行中,总要对保存在对象的数据成员里的信息进行操作,这时应该将信息适时保存到相应的磁盘文件中,以免数据意外丢失。这些都是常规操作,是面向对象的C+程序设计的固定框架。,规范化操作:在面向对象的程序设计中,信息总是放在对象的数据成员里。这些信息最终应该保存到文件中。当程序开始运行时要由打开的文件重新创建对象。在运行过程中,放在对象的数据成员里的信息得到利用和修改。运行结束时必须把这些信息重新保存到文件中,然后关闭文件。,9.6文件与对象,【例9.13】将商店的货物,定义为一个货物数组类。数组对象动态建立,初始为2个元素,不够用时扩充一倍。用文本数据文件建立数组元素对象,要求放在构造函数中,而数据的保存和文件的关闭放在析构函数中。第一次运行时,建立空的数据文件,由键盘输入建立数组元素对象,并写入文件,程序退出时,关闭文件;下一次运行由该文件构造对象,恢复前一次做过的工作。,这是一个标准的面向对象的程序设计,也是对前面各章内容的小结。注意,本例使用了多重的插入运算符重载。,第九章流类库和输入/输出,结束,谢谢!,9.2输入输出的格式控制(选读),访问x_flags的重载函数声明如下:inlinelongios:flags()const;/返回当前标志字inlinelongios:flags(long);/把参数作为新的标志字,并返回原标志字(下同)inlinelongios:setf(long,long);/在原标志字上增加控制,/第一个参数为增加的控制,第二个参数表示取代原来哪几位inlinelongios:setf(long);/增加控制(多项)inlinelongios:unsetf(long);/清除指定位上的控制,9.2输入输出的格式控制(选读),相关接口函数为:inlineintios:width()const;/返回当前域宽inlineintios:width(int);/把参数作为新的域宽,返回原域宽inlinecharios:fill()const;/返回当前填充字符inlinecharios:fill(char);/参数为新填充字符,返回原填充字符inlineintios:precision(int);/参数作为新精度,返回原精度inlineintios:precision()const;/返回当前精度,9.2输入输出的格式控制(选读),【例9.1】整型数输出。#includeusingnamespacestd;intmain(void)intinum=255;cout十进制方式inumt;cout.flags(ios:oct|ios:showbase);/八进制带数制基输出是前面加0;参数等效0 x00a0cout八进制方式inumt;cout.setf(ios:hex);/等效0 x0040,因是或关系,仍带基输出,格式为0 x.cout十六进制方式inumendl;return0;,程序输出:十进制方式255八进制方式0377十六进制方式0 xff,9.2输入输出的格式控制(选读),【例9.2】浮点数输出。intmain()doublefnum=31.415926535;cout默认域宽为:cout.width()位n;cout默认精度为:cout.precision()位n;/floatfield为0 x1800cout默认表达方式:fnumn;/按值大小,自动决定定点还是科学数方式cout.setf(ios:scientific,ios:floatfield);/floatfield为0 x1800cout科学数表达方式:fnumn;cout.setf(ios:fixed,ios:floatfield);/设为定点,取消科学数方式cout定点表达方式:fnumn;cout.precision(9);/精度9位指小数点后9位cout.setf(ios:scientific,ios:floatfield);cout9位科学数表达方式fnumn;return0;,其中floatfield为0 x1800,是为了避免浮点数互相冲突的双重规定,所以是清除原浮点数第13和第14两位,再用新的一位去代替。,9.2输入输出的格式控制(选读),流操作子(setiosflagsstreammanipulator)可代替流格式控制成员函数。它们的使用格式如第一章所介绍的setw()等使用的格式。注意,绝大多数流操作子仅适用于新的C+标准流类库(头文件不带.h)。,cin,cout和clog都是缓冲流。对输出而言,仅当输出缓冲区满才将缓冲区中的信息输出,对输入而言,仅当输入一行结束,才开始从缓冲区中取数据,当希望把缓冲区中的信息立即输出,可用flush,加endl也有同样功能,回车并立即显示,不必等缓冲区满(endl清空缓冲区)。,9.2输入输出的格式控制(选读),【例9.2_1】采用流操作子的浮点数输出。#include#includeusingnamespacestd;intmain()doublefnum=31.415926535;cout默认域宽为:cout.width()位n;cout默认精度为:cout.precision()位n;/floatfield为0 x1800cout默认表达方式:fnumn;/按值大小,自动决定定点还是科学数方式cout科学数表达方式:scientificfnumn;/设为科学数方式cout定点表达方式:fixedfnumn;/设为定点,取消科学数方式cout9位科学数表达方式setprecision(9)scientificfnumi;cin.getline(str,256);/读空缓冲区,吃掉回车符cout请输入字符串endl;cin.getline(str,255);cout输入整数为:iendl;cout输入字符串为:strendl;return0;,9.3.2标准输入/输出成员函数(选读),【例9.4】ignore()和gcount()函数使用。intmain()charstr255;inti,n;cout输入字符endl;/输入Z,一旦输入Z全部结束,不能输入其它字符i=cin.get();coutendl;n=cin.rdstate();/读取状态字cout状态字为:nendl;/状态字为1,流结束cout当输入字符时,取得的是:iendl;/-1,输入Z时,返回EOF,即-1if(n=0)cin.ignore(255,n);/清除多余的字符和回车符cin.clear(0);/A使流恢复正常cout输入字符串1:endl;cin.getline(str,255);coutendl;,9.3.2标准输入/输出成员函数(选读),cout状态字为:cin.rdstate()endl;i=cin.gcount();cout字符串为:strt读入字符数为:it;cout串长为:strlen(str)endl;cin.clear(0);/A使流恢复正常cout输入字符串2:endl;cin.getline(str,255);coutendl;cout状态字为:cin.rdstate()endl;i=cin.gcount();cout字符串为:strt读入字符数为:it;cout串长为:strlen(str)endl;return0;注意,若无两个A行,输入Z后,不再理会余下的所有输入。,9.3.3重载插入和提取运算符,【例9.5】改进【例6.10】,重载插入运算符“void:print()inti;for(i=0;i=last;i+)coutslisti.key;if(i%5=4)coutendl;coutb;coutc;couta=atb=btc=cch)dfile”)运算符在默认情况下是跳过空白(包括空格,制表,backspace和回车等)的,这样复制的文件会缺少一些字符。第二,该程序能确定文件是否复制结束。流类成员函数和运算符全是返回本类型的引用,这里就是流文件对象自身,当文件结束时,返回NULL,这时不再复制,退出循环。第三,复制是按字节进行的,效率很低,按字节传递开销极大,但该程序能正确复制任意类型的文件,不仅是文本文件(看作按字符),二进制文件(看作按字节)也一样可正确完成。如果是文本文件,我们可以按行进行复制。第四,!sfile中的!是重载的运算符,在状态函数中重载,当该操作出现不正常状态,返回true。,【例9.8】按行复制文本文件。intmain()charfilename256,buf100;fstreamsfile,dfile;coutfilename;/对路径名而言空格是无关紧要的,否则要用getline()等成员函数sfile.open(filename,ios:in);/打开一个已存在的文件while(!sfile)coutfilename;sfile.open(filename,ios:in);coutfilename;/只能创建文件,不能建立子目录,如路径不存在则失败,dfile.open(filename,ios:out);if(!dfile)cout目标文件创建失败endl;return-1;while(sfile.getline(buf,100)/按行复制A行if(sfile.gcount()100)dfilebufn;/因回车符未送到B行elsedfile”完成重构对象,而只用一个“(istream/流类作为形式参数必须是引用,9.4.2文本文件的读写,inventory:inventory(stringdes,stringno,intquan,doublecost,doubleret)Description=des;No=no;Quantity=quan;Cost=cost;Retail=ret;ostream/从文件读出是自动把数字串转为数读出,函数体内功能不变,9.4.2文本文件的读写,intmain()inventorycar1(夏利2000,805637928,156,80000,105000),car2;inventorymotor1(金城125,93612575,302,10000,13000),motor2;ofstreamdistfile(d:Ex9_9.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商办贷款合同范本
- 干货产品代销合同范本
- 工厂开挖基地合同范本
- 健身业务合同范本
- 家庭酒馆配送合同范本
- 工厂对接酒店合同范本
- 木材成品销售合同范本
- 私人转让商铺合同范本
- 船舶制造设备更新提质项目可行性研究报告模板-备案拿地
- 特价香蕉售卖合同范本
- 2025年天翼云解决方案架构师认证考试指导题库-下(多选、判断题)
- 道路工程材料第7版 课件全套 -孙大权 0-绪论-6 无机结合料稳定材料
- 数学新课标培训汇报
- 孕优项目培训
- 二零二五版OEM代工项目知识产权保护合同3篇
- 外卖小哥的交通安全课件
- 生态农业开发授权委托书样本
- 糖尿病入院宣教护理
- 招聘与录用(第3版)课件全套 王丽娟 第1-8章 概述、招聘前的理论准备工作 -录用与招聘评估
- 黄色中国风家乡介绍山西
- 扬州树人学校2024-2025七年级上学期9月月考数学试卷及答案
评论
0/150
提交评论