第7章输入输出流.ppt_第1页
第7章输入输出流.ppt_第2页
第7章输入输出流.ppt_第3页
第7章输入输出流.ppt_第4页
第7章输入输出流.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2020/5/18,1,第7章输入输出流,7.1C+的输入和输出7.2标准输出流7.3标准输入流7.4文件操作与文件流7.5字符串流,2020/5/18,2,【目的要求】1.理解I/O流的概念。2.熟悉标准输出流。3.熟悉标准输入流。4.使用流类库进行文件存取的方法。【重点】1.流类库的概念。2.文件操作与文件流。【难点】文件流,2020/5/18,3,7.1C+的输入和输出,7.1.1输入输出的含义程序的输入:指的是从输入文件将数据传送给程序;程序的输出:指的是从程序将数据传送给输出文件。C+的输入与输出包括:(1)标准的输入输出,简称标准I/O。即从键盘输入数据,输出到显示器。(2)文件的输入输出,简称文件I/O。以外存文件为对象的输入输出。(3)字符串输入输出,简称串I/O。对内存中指定的空间进行输入和输出。,2020/5/18,4,7.1.2C+的I/O对C的发展类型安全和可扩展性在C+的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译,因此,C+的I/O操作是类型安全的。C+的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。可扩展性是C+输入输出的重要特点之一,它能提高软件的重要性,加快软件的开发过程。,2020/5/18,5,7.1.3C+的输入输出流流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。在输入操作时,字节流从输入设备(如键盘、磁盘等)流向内存;在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。在C+中,输入输出被定义为类。C+的I/O库中的类称为流类,用流定义的,2020/5/18,6,对象称为流对象。1.iostream类库中有关的类,2020/5/18,7,输入输出流及其文件流见如图所示:,输入文件流类,输出文件流类,通用输入流,通用输出流,通用输入输出流,输入输出文件流类,抽象基类,2020/5/18,8,2.与iostream类库有关的头文件头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现,常见的有:iostream包含了对输入输出流进行操作所需要的基本信息。fstream用于用户管理的文件的I/O操作。strstream用于字符串流I/O。stdiostream用于混合使用C和C+的I/O机制时,例如想将C程序转变为C+程序。iomanip在使用格式化I/O时应包含此文件。,2020/5/18,9,当用户在自己的程序中用#include命令包含了上述有关的头文件就相当于在本程序中声明了所需要的用到的类。3.在iostream头文件中定义的流对象,2020/5/18,10,4.在iostream头文件中重载运算符在iostream头文件中对“”(原意是:左位移位运算符和右位移位运算符)已经进行了重载,使它们能用作标准类型数据的输入和输出。所以,在用它们的程序中必须用#include命令把iostream包含到程序中:#include7.2标准输出流标准输出流是流向标准输出设备(显示器)的数据。ostream类定义了3个输出流对象,即cout、cerr、clog。,2020/5/18,11,1.cout流对象consoleoutput:在控制台(终端显示器)的输出2.cerr流对象consoleerror:在控制台(显示器)显示出错信息3.clog流对象consolelog:在终端显示器上显示出错信息。上面的cerr和clog都是标准出错流,区别:cerr是不经过缓冲区,直接向显示器上输出有关错误信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇到endl时向显示器输出。,2020/5/18,12,7.2.2格式输出前面的所有程序在输出数据时,为简单起见,都没有指定输出的格式,由系统根据数据的类型采取默认的格式。如果要数据按指定的格式输出,可以采用:使用格式控制符;使用流对象的有关成员函数。1.使用控制符控制输出格式下表列出了输出数据的控制符。,2020/5/18,13,2020/5/18,14,注意:上表所示的控制符是在头文件iomanip中定义的,因而程序中要使用这些控制符时应当把此文件包含到程序中,即:#include例7.2用控制符控制输出格式#include#includeusingnamespacestd;intmain()inta;couta;,2020/5/18,15,coutdec:decaendl;/以10进制输出couthex:hexaendl;/以16进制输出coutoct:setbase(8)aendl;/以8进制输出char*pt=China;coutsetw(10)ptendl;coutsetfill(*)setw(10)ptendl;doublepi=22.0/7.0;coutsetiosflags(ios:scientific)setprecision(8);coutpi=piendl;coutpi=setprecision(4)piendl;coutpi=setiosflags(ios:fixed)piendl;return0;,2020/5/18,16,2.用流对象的成员函数控制输出格式通过流对象cout的成员函数来控制输出格式,2020/5/18,17,2020/5/18,18,例7.3用流控制成员函数输出数据。#includeusingnamespacestd;intmain()inta=21;cout.setf(ios:showbase);/设置输出时的基数符号cout“dec:”aendl;/默认以10进制输出cout.unsetf(ios:dec);/终止10进制输出cout.setf(ios:hex);/设置以16进制输出couthex:aendl;cout.unsetf(ios:hex);/终止16进制输出,2020/5/18,19,cout.setf(ios:oct);/设置以8进制输出coutoct:aendl;char*pt=China;cout.width(10);/指定域宽为10coutptendl;cout.width(10);/指定域宽为10cout.fill(*);/指定空白处以*填充coutptendl;doublepi=22.0/7.0;cout.setf(ios:scientific);/指定科学记数法输出coutpi=;,2020/5/18,20,cout.width(14);/指定域宽为14coutpiendl;cout.unsetf(ios:scientific);/终止科学记数法cout.setf(ios:fixed);/指定用定点形式输出cout.width(12);/指定域宽为12cout.setf(ios:showpos);/在输出时显示+号cout.setf(ios:internal);/数符出现在左侧cout.precision(6);/保留6位小数coutpi”从流中提取数据。流提取符“”从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键时,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“”才能从中提取数据。当输入流cin处于出错状态时,其值为false,2020/5/18,22,即cin为0值;如果输入流在正常状态,cin的值为ture,即cin的值为一个非0值。例7.5通过测试cin的值,判断流对象是否处于正常状态。#includeusingnamespacestd;intmain()floatgrade;coutgrade)/如果能从cin流读取数据,cin为真,/执行循环体if(grade=85)coutgradeGOOD!endl;if(grade60)coutgradefail!endl;coutentergrade:;coutTheend.endl;return0;,2020/5/18,24,说明:变量grade从输入流中提取实型数据时,提取操作成功,此时cin流处于正常状态;但在变量grade准备提取一个实型数据时,遇到了字母等其它字符,显然提取操作失败,故程序结束。7.3.2用于字符输入的流成员函数(了解)1.用get函数读入一个字符P2352.用成员函数getline函数读入一行字符P2377.3.3istream类的其他成员函数(了解)1.eof函数P2392.peek函数P2393.putback函数P2394.ignore函数P241,2020/5/18,25,7.4文件操作与文件流7.4.1文件的概念前面讲座的输入输出是以系统指定的标准设备为对象的。在实际应用中,常以磁盘文件为对象,即从磁盘读取数据,将数据写入到磁盘文件。所谓“文件”,指存储在外部介质上数据的集合。对用户来说,常用到的文件分为两大类,一类是程序文件;一类是数据文件。程序中的输入和输出的对象就是数据文件。根据文件中数据的组织形式,文件又可分为ASCII文件和二进制文件。,2020/5/18,26,ASCII文件又称为文本文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称内部格式文件或字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。7.4.2文件流类与文件流对象文件流是以外存文件为输入输出对象的数据流。输出文件流是从内存流向外存文件的数据;输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。,2020/5/18,27,在C+的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作。除了前面已经介绍过的标准输入输出流类istream,ostream和iostream类外,还有3个用于文件操作的文件类:(1)ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。(2)ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。(3)fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。,2020/5/18,28,要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。文件流对象是用文件流类定义的,而不是用istream和ostream类来定义的。可以用下面的方法建立一个输出文件流对象:ofstreamoutfile;也可以建立一个输入文件流对象:ifstreaminfile;,2020/5/18,29,虽然上面定义了一个输入或输出流文件对象,但还未指定它向哪一个磁盘文件输入或输出。7.4.3文件的打开与关闭1.打开磁盘文件打开文件是指在文件读写之前做必要的准备工作,包括:(1)为文件流对象和指定的磁盘文件建立关联,以便合文件流流向指定的磁盘文件。(2)指定文件的工作方式,如:该文件是输入文件还是输出文件,是ASCII文件还是二进制文件等,2020/5/18,30,方法一:调用文件流的成员函数open,如:ofstreamoutfile;/定义ofstream类(输出文件流类)对象outfileoutfile.open(“a1.dat”,ios:out);/使文件流与a1.dat文件建立关联调用成员函数open的一般形式为:文件流对象.open(磁盘文件名,输入输出方式);其中,磁盘文件名可以包括路径,如缺省路径,则默认为当前目录下的文件。,2020/5/18,31,方法二:在定义文件流对象时指定参数。在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能,因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如:ostreamoutfile(“a1.dat”,ios:out);一般多用此方法,因为比较方便,其作用与open函数相同。上面两种方法中的输入输出方式见下表所示:,2020/5/18,32,2020/5/18,33,说明:(1)每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般认为1),表示文件结束了。(2)如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件,则流对象的值为0。可以据此测试打开是否成功。如:,2020/5/18,34,if(outfile.open(“a1.dat”,ios:app)=0cout“open.error”;或if(!outfile.open(“a1.dat”,ios:app)cout”实现对磁盘的读写,如同用cin,cout和对标准设备进行读写一样。(2)用文件流的put,get,getline等成员函数进行字符的输入输出。,2020/5/18,36,例7.11写入磁盘文件#include#includeusingnamespacestd;intmain()inta10;ofstreamoutfile(f1.dat“,ios:out);/定义文件流对象,打开磁盘文件f1.datif(!outfile)/如果打开失败,outfile返回0值cerropenerror!ai;outfileai“”;/向磁盘文件f1.dat输出数据outfile.close();/关闭磁盘文件f1.datreturn0;说明:(1)在VC中调试时必须包含头文件:fstream。,2020/5/18,38,(2)ofstreamoutfile(“f1.dat“,ios:out);语句中的参数ios:out可以省略,这是默认形式。即下面两种写法等价:ofstreamoutfile(f1.dat“,ios:out);ofstreamoutfile(f1.dat“);(3)如果打开成功,则文件流对象outfile的返回值为非0值;如果打开失败,则返回值为0(假)(4)函数exit(1)为系统函数,表示结束运行。其中的参数为任意整数,可用0,1或其他整数(5)outfileaiai;coutai;coutendl;max=a0;order=0;,2020/5/18,41,for(i=1;imax)max=ai;order=i;coutmax=maxendlorder=“orderendl;infile.close();return0;,2020/5/18,42,7.4.5对二进制文件的操作二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。对二进制文件的操作在使用时需要先打开文件,用完后要关闭二进制文件。在打开时要用ios:binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件,这是和ASCII文件不同的地方。,2020/5/18,43,1.用成员函数read和write读写二进制文件对二进制文件的读写主要是用istream类的成员函数read和write来实现。这两个成员函数的原型为:istream式中的a是输出文件流对象,write函数将字符指针,2020/5/18,44,p1所给出的地址开始的50个字节的内容不加转换地写到磁盘文件中。b是输入流对象,read函数从b所关联的磁盘文件中,读入30个字节,存放在字符指针p2所指的一段空间内。例7.14将数据以二进制形式存放在磁盘文件中#include#includeusingnamespacestd;,2020/5/18,45,structstudentcha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论