c++第十四章.ppt_第1页
c++第十四章.ppt_第2页
c++第十四章.ppt_第3页
c++第十四章.ppt_第4页
c++第十四章.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第14章输入/输出流类库,输入/输出:程序与计算机外设之间的数据交换。输入:程序从外设接收数据。输出:程序将数据输出到外设。C+语言本身没有专门的输入/输出语句,但C+的编译系统通常都提供输入/输出流类库,用于用户输入/输出。,14.1概述14.2基本I/O流类体系14.3标准设备的输入/输出14.4重载提取和插入运算符14.5文件14.6综合应用举例作业:4,8,11,12,14.1概述流,数据的输入/输出以字节为单位,依次逐个进行。数据的字节序列称为字节流,简称流(Stream)。按对字节内容的解释方式分,字节流分为字符流(也称文本流)和二进制流。字符流:将字节流的每个字节按ASCII字符解释。数据传输时需做转换,效率较低,但字符流可直接编辑、显示或打印,字符流文件通行于各类计算机。例如int型数值1234567在内存中占4字节,但输出前要先转换成数值串“1234567”后,才能输出。反之亦然。源程序文件和文本文件都是字符流。二进制流:将字节流的每个字节按二进制方式解释。数据传输时不做转换,效率高,但异类计算机对数据的二进制存放格式存在差异,且无法人工阅读,二进制流文件可移植性较差。输入/输出流的类体系称为流类,流类的实现称为流类库。,文件,文件:相关数据的字节序列集合。计算机中的程序、数据、文档常以文件形式存于外存。输入/输出设备具有字节流特征,也是文件。例如键盘是输入文件,显示器、打印机是输出文件。不同的文件所允许的操作可能不同。例如对于磁盘文件,可以将数据写入文件,也可以将数据从文件中取出;而对于打印机文件,只能将数据写入,而不能从打印机文件中取出数据。文件名:为文件取的名字,以区别不同的文件。文件名通常由使用标识符,但不同的计算机系统,对文件名的组成规则有所不同,参见有关操作系统。程序可通过文件名来使用文件。,缓冲,缓冲区:系统在主存中开辟的、用来临时存放输入/输出数据的区域。如先将输入的数据送到缓冲区,再从缓冲区中取出。缓冲区的作用:因输入/输出设备的速度比CPU慢得多,若CPU直接与外设交换数据,必然占用大量CPU时间,降低CPU的使用效率。使用缓冲后,CPU只要从缓冲区中取数据或者把数据写入缓冲区,而不必等待外设的具体输入/输出操作,显著提高了CPU的使用效率。按在缓冲区中是否立即处理,流分为缓冲流和非缓冲流。常用缓冲流,仅在特殊场合,才用非缓冲流。非缓冲流:一旦数据送入缓冲区,立即处理。缓冲流:仅当缓冲区满或当前送入的数据为新的一行字符时,系统才对流中的数据进行处理(称为刷新)。,14.2基本I/O流类体系概述,基本I/O流类体系:如图所示,在iostream.h中说明,支持C+输入/输出程序设计。,类istream:类ios的公有派生类,提供输入操作。类ostream:类ios的公有派生类,提供输出操作。类iostream:由类istream和ostream公有派生,并未增加新成员,以支持输入和输出操作。类ios:类istream和ostream的虚基类,提供流的格式化输入/输出和错误处理,并通过指向类streambuf的对象的指针成员来管理流缓冲区。类streambuf:管理流缓冲区。实际编程时,常用类ios、istream、ostream和iostream提供的公有接口成员函数来输入/输出。,预定义的标准流与提取和插入运算符,预定义的标准流对象:cin、cout、cerr和clog。需在程序中包含头文件“iostream.h”方可使用。cin为标准输入流,缺省代表键盘。cout为标准输出流,缺省代表显示器。cerr和clog为标准错误信息输出流,缺省代表显示器。cerr为非缓冲流,其余为缓冲流。提取运算符:用于从流中提取一个字节序列。插入运算符b;if(b!=0)couta/b=a/bn;elsecerr除数为零!n;cout、cerr和clog的用法相同但作用不同。cout的输出可重定向(请参见有关操作系统的介绍)。cerr和clog的输出不可重定向。clog为缓冲流,输出的数据不能及时显示。通常将程序中的提示信息(输入提示和出错提示等)用cerr输出,结果数据用cout输出,而clog很少使用。,流的格式控制,格式化输入/输出仅用于文本流,而二进制流是原样输入输出,不必做格式化转换。“iomanip.h”中预定义了13个格式控制函数,用于控制输入/输出数据的格式,如下表所示。,例14.2用格式控制函数指定输出数据的域宽和数制。#include#includevoidmain(void)inta=256,b=128;coutsetw(8)ab=bn;couthexab=decbi;s=cin.rdstate();coutnum=i”运算符实现。基本类型数据的输出由类ostream多次重载“”运算符。重载提取运算符的格式:friendistream,返回值类型必须是istream不再使用指定文件时,应及时关闭文件,如:infile.close();,文件的打开,用文件流类的成员函数open打开文件:voidifstream:open(constchar*,int=ios:in,int=filebuf:openprot);voidofstream:open(constchar*,int=ios:out,int=filebuf:openprot);voidfstream:open(constchar*,int,int=filebuf:openprot);,指定打开的文件名(可含盘符和路径):如“d:t1.dat”。,指定文件的打开方式:输入文件流的缺省值为ios:in:按输入文件方式打开文件。输出文件流的缺省值为ios:out:按输出文件方式打开文件。输入输出文件流没有缺省的打开方式,在打开文件时应指明。,指定打开文件的保护方式:缺省值与filebuf:sh_compat相同。filebuf:sh_compat:共享filebuf:sh_none:独享filebuf:sh_read:读共享filebuf:sh_write:写共享,文件的打开方式:用ios类中定义的公有枚举类型open_mode中的枚举常量来描述。enumopen_modein=0 x01,/输入(读)方式out=0 x02,/输出(写)方式ate=0 x04,/添加方式,文件指针最初指向文件尾app=0 x08,/追加方式,文件指针始终指向文件尾trunc=0 x10,/截断文件方式nocreate=0 x20,/不建文件方式noreplace=0 x40,/不替换文件方式binary=0 x80/二进制方式;因每种打开方式都用一个二进位表示,故在不矛盾的情况下,可用运算符“|”(二进制按位或)将多种打开方式组合使用。,文件打开方式说明不以binary方式打开的文件,都是文本文件。输入文件仅可用in、nocreate和binary及其组合打开。文件指针从0开始连续编号(0代表文件头),以字节为单位,用于指示文件的读/写位置,文件每读/写一个字节,文件指针就后移一个字节。文件指针的初值由文件打开方式指定,若文件打开方式含app或ate,则文件指针指向文件尾,否则指向文件头,如:,用文件流类的构造函数打开文件文件流类ifstream、ofstream和fstream的构造函数所带参数与各自的成员函数open()所带参数完全相同。因此,在说明这三种文件流类的对象时,通过调用各自的构造函数,也能打开文件。读方式打开文件ifstreamf1(file1.dat,ios:in|ios:nocreate);写方式打开文件ofstreamf2(file2.txt);读方式打开文件fstreamf3(file3.dat,ios:in|ios:nocreate);,文件打开与否的判别文件打开后,应判断打开是否成功。若不成功,则后续的文件读/写操作就没有实际意义。举例ifstreamf2;f2.open(file.dat,ios:in|ios:nocreate);if(!f2)cout”和插入运算符“f2;ifstreamin(f1,ios:in|ios:nocreate);ofstreamout(f2);if(!in)coutch)outch操作的返回值为in,成为while语句的条件。因不是基本类型数据,无法直接运算,除非做类型转换。ios类仅重载了一个类型转换函数:operatorvoid*()returnfail()?0:this;,问:可否用while(!in.eof()inch;outch;代替左边的代码?,隐式类型转换:(void*)infail()?0:this,或,while(in.get(ch)outt)/依次读一个实数sum+=t,count+;coutn平均值=sum/count,count=count;,设data.txt文件的内容为:2456.933.745.68899.82050程序运行结果:平均值=52.25,count=8,二进制文件的使用,用二进制文件方式读写数据时,数据不做变换,直接传送。二进制文件的读写操作:使用读写字符的文件流的成员函数(如例14.5);使用文件流的成员函数read()和write()。成员函数read()的原型:istream功能:将t所指内存的前n字节数据写入二进制文件。,例14.7将150之间的所有偶数存入二进制文件data.dat中。#include#includevoidmain(void)ofstreamout(data.dat,ios:out|ios:binary);if(!out)cout不能打开data.datn;exit(1);for(inti=2;i50;i+=2)out.write(char*),将整型指针转换成字符型指针,以符合该函数第一个参数类型的要求。,例14.8从例14.7产生的数据文件data.dat中读取二进制数据,并按每行10个数的形式显示。,#includevoidmain(void)inti,a;ifstreamin(data.dat,ios:in|ios:binary|ios:nocreate);if(!in)cout不能打开文件data.datn;return;for(i=1;in.read(char*),函数调用分析:读sizeof(int)个字节数据送a;返回的文件流对象in做for语句的表达式2,无法直接运算,除非转换转换成基本类型的数据。对象in的唯一类型转换函数“void*”将in隐式转换成基本类型的数据做为for语句的表达式2参加运算。见例14.5。,作用:读4个字节数据送a,若输入出错(包括文件结束)则返回零,否则为非零。,文件的随机读写,顺序读写:按先后顺序读/写文件中的数据,如前所述。随机读写:从文件的任何指定位置读/写数据,主要用于二进制文件。随机读写的前提是移动文件指针。移动输入流文件指针的成员函数:istream,streampos和streamoff与long同型。pos和off指定文件指针相对于参考点的移动值。若为负值,则前移,否则后移。文件头为前,文件尾为后。,seek_dir是ios类中定义的公有枚举类型:enumseek_dir/参考点beg=0,/文件头cur=1,/当前位置end=2/文件尾;dir指定文件指针移动的参考点。,文件指针移动举例:设有二进制输入文件流对象ff.seekg(-50,ios:cur);/文件指针从当前位置前移50个字节f.seekg(50,ios:cur);/文件指针从当前位置后移50个字节f.seekg(-50,ios:end);/文件指针从文件尾前移50个字节注意:在移动文件指针时,必须保证移动后的指针值大于等于0且小于等于文件尾字节编号,否则将导致后续读/写出错。移动输出流文件指针的成员函数:ostream/输出流功能:返回当前文件指针值(相对于文件头)。随机文件的读写分两步:先将文件指针移到开始读

温馨提示

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

评论

0/150

提交评论