C++面向对象程序设计教学PPT9.ppt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C++ 面向 对象 程序设计 教学 PPT9
- 资源描述:
-
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,9,章 文件与流,C+,具有一个功能强大的,I/O,类继承体系结构用于处理数据的输入,/,输出问题,该体系结构不仅提供了对系统内置数据类型的输入,/,输出操作,而且允许程序员通过重载扩展其功能以实现自定义数据类型的输入和输出操作。,本章主要介绍,C+,流的基本结构,数据的输入输出及其格式化问题,同时还介绍了,C+,文件的编程技术。,9.1 C+,I/O,流及流类库,1,、流的概念,所谓流,是指数据的有向流动,即数据从一个设备流向另一个设备。,流实际上是一种对象,它在使用前被建立,使用后被删除。数据的输入,/,输出操作就是从流中提取数据或者向流中添加数据。,通常把从流中提取数据的操作称为析取,即读操作;向流中添加数据的操作称为插入操作,即写操作。,9.1 C+,I/O,流及流类库,2,、,C+I/O,流类的继承结构,C+,建立了一个十分庞大的流类库来实现数据的输入,/,输出操作,其中的每个流类实现不同的功能,这些类通过继承组合在一起,。,9.1 C+,I/O,流及流类库,3,、,C+,主要的流类简介,streambuf,主要作为其他类的支持,定义了对缓冲区的通用操作,如设置缓冲区,从缓冲区中读取数据,或向缓冲区写入数据等操作,filebuf,类使用文件来保存缓冲区中的字符序列。它定义了文件读、写、打开、关闭等常用操作。,ios,是所有流类的基类,提供对流状态进行设置的主要功能。如文件数据的格式码设置与取消,关链文件缓冲区借以实现数据读写等,9.1 C+,I/O,流及流类库,istream,是输入流类,实现数据输入的功能;,ostream,是输出流类,实现数据输出的功能;,iostream,是,istream,和,ostream,的派生类,它继承了,istream,类和,ostream,类的行为,支持数据输入、输出的双向操作,在程序中常通过它来实现数据的输入与输出功能。,fstreambase,从,ios,派生,提供了文件操作的许多功能,作为其他文件操作类的公共基类。,ifstream,类用来实现文件读取操作,,ofstream,类用来实现文件写入操作。,fstream,继承了,fstreambase,和,iostream,类的功能,实现了文件读,/,写的双向操作。,9.1 C+,I/O,流及流类库,4,、,C+,预定义的输入,/,输出流对象,为了便于程序数据的输入,/,输出,,C+,预定义了几个标准输入,/,输出流对象。在程序中可以直接引用它们来输入,/,输出数据。如下表所示,对,象,定,义,说,明,ostream,cout,;,cout,与标准输出设备相关联,ostream,cerr,;,cerr,与标准错误输出设备相关联(非缓冲方式),ostream,clog;,clog,与标准错误输出设备相关联(缓冲方式),istream,cin,;,与标准输入设备相关联,9.2,使用,I/O,成员函数,1,、用,Cin,输入数据的问题,用,cin,输入字符串数据时,如果字符串中含有空白就不能完整输入。因为遇到空白字符时,,cin,就认为字符串结束了。,【,例,9-1】,用,cin,输入字符串的问题。,/Eg9-1.cpp,#include,using namespace std;,void main(),char a50;,cout,a;,cout,a,重载成员函数,.,int,get();,istream,&,get(char,*,int,char,=n);,istream,&,get(char,istream,&,getline,(char*,int,char,=n);,istream,&,read(char,*,int,);,istream,&,ignore(int,=1,int=EOF);,int,peek();,istream,&,putback(char,);,.,;,istream,或,istream.h,头文件中找到此,class,的声明!,9.2.1,istream,流中的常用成员函数,2,、几个常用的输入流成员函数,(,1,),int,get,(),(,2,),istream,&,get,(char*c,int,n,char,=n),(,3,),istream,&,read,(char,*c,int,n);,(,4,),istream,&,ignore,(int,=1,int=EOF),(,5,),istream,&,getline,(char,*,c,int,n,char,=n);,【,例,9-2】,用函数,get,和,getline,读取数据。,#include,using namespace std;,void main(),char,c,char,a50,char s1100;,cout,use get()input char:;,while(c,=,cin.get,()!=n)/L1,cout,c;,cout,endl,;,cout,use get(a,10)input char:;,cin.get(a,10);/L2,cout,a,endl,;,cin.ignore(1);/L3,cout,use getline(s1,10)input char:;,cin.getline(s1,10);/L4,cout,s1,endl,;,分析例,9-2,的程序执行情况,下面是程序执行时的一组输入数据和输出结果:,use get()input char:,abcd,abcd,use get(a,10)input char:,12345678,12345678,use getline(s1,10)input char:,this is a,str,this is a,此输入数据将建立如图所示的输入流,9.2.2,ostream,流中,的常用成员函数,1,、,ostream,类提供了许多用于数据输出的成员函数,并通过流的输出运算符,重载,实现了对内置数据类型的输出功能。在,ostream,类中的声明原型如下:,class _CRTIMP,ostream,:virtual public,ios,public:,ostream,ostream,ostream,ostream,&,put(char,);,ostream,&,write(const,char*,int,);,ostream,&,seekp(streampos,);,.,;,9.2.2,ostream,流中,的常用成员函数,2,、几个常用输出流类的成员函数,ostream,&,put(char,c);,ostream,&,write(const,char*,c,int,n);,flush,【,例,9-3】,用,get,读取数据,用,put,及,write,输出数据的例子。,/Eg9-3.cpp,#include,using namespace std;,void main(),char c;,char a50=this is a string.;,cout,use get()input char:;,while(c,=,cin.get,()!=n)/L1,用,get,读取字符,遇回车键结束,cout.put(c,);/L2,将,c,中的字符输出,cout.put(n,);/L3,输出一个回车换行符,cout.put(t).put(h).put(i).put(s).put(n,);/L4,输出,this,cout.write(a,sizeof(a)-1).put(n);/L5 write,一次输出多个字符,cout,lookt here!,endl,;,9.2.4,ios,类提供的格式控制,ios,是,C+,所有流类的基类,它包含了,C+,流的主要特性。,1,ios,中的格式化标志,ios:skipws,跳过输入流中的空白字符,ios:left,输出数据按左对齐,如,12 ,ios:right,输出数据按右对齐,如,12,ios:dec,按十进制数据输出,ios:oct,按八进制数据输出,ios:hex,按十六进制数据输出,ios:showbase,在输出数据前面显示基数(八进制是,0,,十六进制是,0 x,),ios:showpoint,浮点数输出带小数点,ios:uppercase,用大写字母输出十六进制数(即,ABCDEF,,默认是小写),ios:showpos,在正数前加“,+”,ios:scientific,用科学计数法输出浮点数,如,2.122E2,ios:fixed,用定点数形式输出浮点数,如,212.2,ios:unitbuf,完成后立即刷新缓冲区,9.2.4,ios,类提供的格式控制,2,ios,中的格式化成员函数,setf(flags,),设置指定的格式化标志,flags,,,unsetf(flags,),取消指定的格式化标志,flags,,,setf(flags,filed,),先清除、然后设置标志,flags,可以是上面在,1,中列举的格式化标志符,9.2.4,ios,类提供的格式控制,3,设置域宽、精度、填充字符的成员函数,ch,=fill(),返回填充字符(默认为空格),,ch,是一个字符变量,fill(ch,),设置填充字符,,ch,是要设置为填充的字符,p=precision(),获取当前浮点数的精度,,p,是一个整型变量,precision(p,),设置精度,,p,是一个整数,代表要设置的数字位数,w=width(),获取当前字段宽度(字符个数),,w,是整型变量,width(w,),设置当前字段宽度,,w,是代表设置输出宽度的整数,【,例,9-4】,用,ios,成员函数及格式化标志设置输出数据的格式。,/Eg9-4.cpp,#include,using namespace std;,void main(),char c30=this is string;,double d=-1234.8976;,cout.width(30);,cout.fill,(*);,cout.setf(ios:left,);,cout,c-L1,endl,;,cout.width(30);,cout.setf(ios:right,);,cout,c-L2,endl,;,cout.setf(ios:dec|ios:showbase|ios:showpoint,);,cout.width(30);,cout,d-L3n;,cout.setf(ios:showpoint,);,cout.precision(10);,cout.width(30);,cout,d-L4n;,cout.width(30);,cout.setf(ios:oct,ios:basefield,);,cout,100-L5n;,例,9-4,程序运行结果如下,this is string*-L1,*this is string-L2,*-1234.90-L3,*-1234.897600-L4,*0144-L5,9.2.5,利用,操纵符格式化数据,1,、,C+,流类库中的每个流对象都维护着一个格式状态,它控制着数据格式化操作的细节。如输出数据的基数(默认为十进制数据)、对齐方式、精度等。,2,、,C+,还提供了一组可以对数据进行格式化的预定义操纵符(也称操纵算子),9.2.5,利用,操纵符格式化数据,3,、,C+,流类中的操纵符,showbase,(,noshowbase,)显示(不显示)数值的基数前缀,showpoint,(,noshowpoint,)显示小数点(存在小数部分时才显示小数点),showpos,(,noshowpos,)在非负数中显示(不显示),+,skipws,(,noskips,)输入数据时,跳过(不跳过)空白字符,uppercase(nouppercase,),十六进制显示为,0X,(,0 x,),科学计数法显示,E,(,e,),dec,/,oct,/hex,十进制,/,八进制,/,十六进制,left/right,设置数据输出对齐方式为:左,/,右 对齐,fixed,以小数形式显示浮点数,scientitific,用科学计数法显示浮点数,flush,刷新输出缓冲区,ends,插入空白字符,然后刷新,ostream,缓冲区,endl,插入换行字符,然后刷新,ostream,缓冲区,ws,跳过开始的空白,9.2.5,利用,操纵符格式化数据,3,、,C+,流类中的操纵符,showbase,(,noshowbase,)显示(不显示)数值的基数前缀,showpoint,(,noshowpoint,)显示小数点(存在小数部分时才显示小数点),showpos,(,noshowpos,)在非负数中显示(不显示),+,skipws,(,noskips,)输入数据时,跳过(不跳过)空白字符,uppercase(nouppercase,),十六进制显示为,0X,(,0 x,),科学计数法显示,E,(,e,),dec,/,oct,/hex,十进制,/,八进制,/,十六进制,left/right,设置数据输出对齐方式为:左,/,右 对齐,fixed,以小数形式显示浮点数,scientitific,用科学计数法显示浮点数,flush,刷新输出缓冲区,ends,插入空白字符,然后刷新,ostream,缓冲区,endl,插入换行字符,然后刷新,ostream,缓冲区,ws,跳过开始的空白,9.2.5,利用,操纵符格式化数据,4,、头文件,或,中的操纵符函数,setfill(ch,),设置,ch,为填充字符,setprecision(n,),设置精度为,n,位有效数字,setw(w,),设置数据的输出宽度为,w,个字符,setbase(b,),基数设置为,b,(,b=8,,,10,,,16,)进制,【,例,9-5】,修改例,9-4,,用操纵符格式化输出数据,实现同样的功能。,/Eg9-5.cpp,#include,#include,using namespace std;,void main(),char c30=this is string;,double d=-1234.8976;,cout,setw(30)left,setfill,(*)c-L1,endl,;,cout,setw(30)right,setfill,(*)c-L2,endl,;,cout,dec,showbase,showpoint,setw(30)d-L3n;,cout,setw(30),showpoint,setprecision(10)d-L4n;,cout,setw(30)setbase(8)100-L5n;,9.3,文件,操作,1,、文件的概念,文件是存储在存储介质上(如磁盘、磁带、光盘)的数据集合。,2,、文件的类型,文本文件,文本文件在磁盘上存放相关字符的,ASCII,码,所以又称为,ASCII,文件。,二进制文件,二进制文件在磁盘上存储相关数据的二进制编码,它是把内存中的数据,按其在内存中的存储形式原样写到磁盘上而形成的文件。,9.3.1,文件与流,1,、流与文件,C+,将文件看成是一个个字符在磁盘上的有序集合,用流来实现文件的读写操作。,2,、与文件相关的流,ifstream,ofstream,fstream,9.3.1,文件与流,3,、用流操作文件的过程,须经过以下,4,个步骤,(,1,)建立文件流,ifstream,iFile,;,ofstream,oFile,;,fstream,ioFile,;,(,2,)打开文件,void,open(const,char*,filename,int,mode,int,access);,(,3,)访问文件,(,4,)关闭文件,iFile.close,();,oFile.close,();,9.3.1,文件与流,打开文件的方式,文件打开方式,说,明,ios:in,以输入方式打开文件,即读文件(,ifstream,类对象默认方式),ios:out,以输出方式打开文件,即写文件(,ofstream,类对象默认方式),ios:app,以添加方式打开文件,新增加的内容添加在文件尾,ios:ate,以添加方式打开文件,新增加的内容添加在文件尾,但下次添加时则添加在当前位置,ios:trunc,如文件存在就打开并清除其内容,如不存在就建立新文件,ios:binary,以二进制方式打开文件(默认为文本文件),ios:nocreate,打开已有文件,若文件不存在,则打开失败,ios:noreplace,若打开的文件已经存在,则打开失败,9.3.1,文件与流,文件访问模式,filebuf:openport,共享方式,filebuf:sh_none,独占方式,不允许共享,filebuf:sh_read,允许读共享,filebuf:sh_write,允许写共享,9.3.1,文件与流,【,例,9-6】,假设有学生的,chinese,、,math,、,computer,成绩表如下:,张三,,76,,,98,,,67,;李四,,89,,,70,,,60,;,王十,,91,,,88,,,77,;黄二,,62,,,81,,,75,;,刘六,,90,,,78,,,67,用,fstream,文件流在目录,C:,dk,下建立,a.dat,文件,并将上述学生成绩写入文件中。然后以二进制方式打开建立的文件,读出文件中的数据,计算每个学生的总成绩并将它显示在屏幕上。,/Eg9-6.cpp,#include,#include,using namespace std;,void main(),fstream,ioFile,;,ioFile.open(C:dka.dat,ios:out,);,ioFile,张三,76 98 67,endl,;/L3,ioFile,李四,89 70 60,endl,;,ioFile,王十,91 88 77,endl,;,ioFile,黄二,62 81 75,endl,;,ioFile,刘六,90 78 67,endl,;,ioFile.close,();,9.3.1,文件与流,ioFile.open(C:dka.dat,ios:in|ios:binary,);/L5,char name10;,int,chinese,math,computer,;,cout,姓名,t,英语,t,数学,t,计算机,t,总分,name;,while(!ioFile.eof,(),ioFile,chinese,mathcomputer;,cout,namet,chinese,tmathtcomputert,chinese+math+computer,name;,ioFile.close,();,9.3.2,二进制文件,1,、二进制文件与文本文件的区别,在读文件时,它们,判定文件结束标志的方法存在区别,。在读文本文件的过程中,当,get,之类的成员函数遇到文件结束符时,它返回常量,EOF,作为文件结束标志,但二进制文件不能用,EOF,作为文件结束的判定值。因为,EOF,的值是,1,,若文件中某个字节的值为,1,,就会被误认为是文件结束符。,C+,提供了一个成员函数,eof,来解决这个问题,它的用法如下:,int,xx:eof,(),其中,,xx,代表输入流对象,到达文件末尾时,返回一个非,0,值,否则返回,0,。,9.3.2,二进制文件,2,、二进制文件操作方法,用,get,和,put,按字节方式读写文件数,read,和,write,按数据块的方式读写文件数据,【,例,9-7】,用二进制方式建立一个磁盘文件,将,ASCII,编码为,0,90,之间的字符写入到文件,C:,dka.dat,中,然后用二进制文件方式读出并在屏幕上显示,a.dat,的内容。,/Eg9-7.cpp,#include,#include,using namespace std;,void main(),char,ch,;,ofstream,out(C:dka.dat,ios:out|ios:binary,);/L1,for(int,i=0;i90;i+),if(!(i,%30),out.put(n,);,out.put(char(i,);,out.put,();,out.close,();,ifstream,in(C:dka.dat,ios:in|ios:binary,);/L6,while(in.get(ch,),cout,ch,;,in.close,();,9.3.2,二进制文件,【,例,9-8】,设计一个,person,类,从键盘输入每个人的姓名、身份证号、年龄、地址等数据,并将每个人的信息保存在目录,C:,dk,下的二进制文件,person.dat,中,然后将文件中的个人信息读出来,保存在,vector,类型的向量中并显示出来。,/Eg9-8.cpp,#include,#include,#include,#include,using namespace std;,class Person,private:,char name20;,char id18;,int,age;,char addr20;,public:,Person(),Person(char,*,n,char,*,PerId,int,Age,char*Address),strcpy(name,n,);,strcpy(id,PerId,);,strcpy(addr,Address,);,age=,Age,;,void display(),cout,nametidtaget,addr,endl,;,;,void main(),vector p;vector:,iterator,pos;char,ch,;,ofstream,out(C:dkperson.dat,ios:out|ios:app|ios:binary,);,char Name20,ID18,Addr20;,int,Age;,cout,-,输入个人档案,-,endl,endl,;,do,cout,Name;,cout,ID;,cout,Age;,cout,Addr,;,Person s1(Name,ID,Age,Addr);,out.write(char,*),cout,ch,;,while(ch,=y);,out.close,();,ifstream,in(C:dkperson.dat,ios:in|ios:binary,);/L9,Person s1;,in.read(char,*),while(!in.eof,()p.push_back(s1);,in.read(char,*),cout,n-,从文件中读出的数据,-,endl,endl;/L15,pos=,p.begin,();,for(pos,=,p.begin();pos,!=,p.end();pos,+)(*,pos).display,();,9.3.3,随机文件,1,、顺序文件与随机文件,顺序访问是指按照从前到后的顺序依次对文件进行读写操作,有些存储设备只支持顺序访问,如磁带。,随机访问也称为直接访问,可以按任意次序对文件进行读写操作,2,、随机文件访问方式,对于随机文件,,C+,流类提供了一个操作它的的文件,指针,该指针可在文件中移动,将它指向要读写的字节位置,然后从该位置读取或写入指定字节数的数据块,这样就实现了文件数据的随机访问。,9.3.3,随机文件,3,、定位输入文件读指针的成员函数,istream,&,seekg(long,pos);,istream,&,seekg(long,off,dir);,long,tellg,();,4,、定位输出文件写指针的成员函数,ostream,&,seekp(long,pos);,ostream,&,seekp(long,off,dir);,long,tellp,();,【,例,9-9】,某雇员类,Employee,有编号、姓名、年龄、工资等数据成员。设计一个随机文件保存各雇员的各项数据。,/Eg9-9.cpp,#include,#include,#include,using namespace std;,class Employee,private:,int,number,age;,char name20;,double,sal,;,public:,Employee(),Employee(int,num,char,*,Name,int,Age,double Salary),number=num;,strcpy(name,Name,);,age=,Age,;,sal,=Salary;,void display(),cout,numbertnametaget,sal,endl,;,;,void main(),ofstream,out(Employee.dat,ios:out|ios:binary,);/,定义随机输出文件,Employee e1(1,张三,23,2320);,Employee e2(2,李四,32,3210);,Employee e3(3,王五,34,2220);,Employee e4(4,刘六,27,1220);,out.write(char,*)/,按,e1,e2,e3,e4,顺序写入文件,out.write(char,*),out.write(char,*),out.write(char,*),/,下面的代码将,e3,(即王五)的年龄改为,40,岁,Employee e5(3,王五,40,2220);,out.seekp(2*sizeof(e1);/,指针定位到第,3,(起始为,0,)个数据块,out.write(char,*)/,将,e5,写到第,3,个数据块位置,覆盖,e3,out.close,();/,关闭文件,/,以二进制方式建立输入文件,ifstream,in(Employee.dat,ios:in|ios:binary,);,Employee s1;,/s1,用于保存从文件中读出的数据,cout,n-,从文件中读出第,3,个人的数据,-,nn,;,in.seekg(2*(sizeof(s1),ios:beg),/,文件指针定位到第,3,个数据块,in.read(char,*),/,读出第,3,个雇员的数据块,s1.display();,cout,n-,从文件中读出全部的数据,-,nn,;,in.seekg(0,ios:beg);,/,移动文件指针,指向文件开头,in.read(char,*),/,读出第,1,个数据块,while(!in.eof,(),/,如果没有读完文件,就继续读,s1.display();,/,显示读出的雇员数据,in.read(char,*),/,读当前文件指针处的数据,The End,谢谢大家!,展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




C++面向对象程序设计教学PPT9.ppt



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/13336260.html