收藏 分销(赏)

c--第八章文件的应用.ppt

上传人:仙人****88 文档编号:14753570 上传时间:2026-11-14 格式:PPT 页数:59 大小:162KB 下载积分:10 金币
下载 相关
c--第八章文件的应用.ppt_第1页
第1页 / 共59页
c--第八章文件的应用.ppt_第2页
第2页 / 共59页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第八章 文件的应用,1,教学目标,理解数据文件的基本概念;,掌握建立文件、打开和关闭文件、读写顺序文件数据的基本操作;,了解文件指针的定位操作。,8.1 C+,的输入输出,一、输入输出的含义,C+,语言的输入与输出包括以下,3,方面的内容:,对系统指定的标准设备的输入和输出,。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为,标准的输入输出,简称为标准,I/O,。,以外存磁盘文件为对象进行输入输出,。即从磁盘文件输入数据,数据输出到磁盘文件。这种以外存文件为对象的输入输出称为,文件的输入输出,简称文件,I/O,。,对内存中指定的空间进行输入输出,。通常指定一个字符数组作为存储空间。这种输入输出称为,字符串输入输出,简称串,I/O,。,C+,采取不同的方法来实现以上,3,种输入输出。,二、,C+,的输入输出流,C+,语言没有,I/O(,输入,/,输出,),语句。它带有一个面向对象的,I/O,软件包,它就是,I/O,流库,iostream,,它被认为是,C+,语言的一个扩充。,通过调用该库中不同的类可以实现不同的输出功能,。,为了使用,iostream,流库,必须在程序中,包含,iostream.h,头文件。,概念:,C+,的输入输出流,输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。,C+,形象地将,此过程称为流,。,C+,的输入输出流,是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。,在,输入,操作时,在,输出,操作时,输入设备,(如键盘、磁盘),内存,输出设备,(如屏幕、打印机、磁盘等),内存,字节流,字节流,流中的信息内容,可以是,ASCII,字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。,C+,编译系统提供了用于输入输出的,iostream,类库。在,iostream,类库中包含许多用于输入输出的类。,类名,作用,在哪个头文件中声明,ios,抽象流基类,iostream,istream,通用输入流类和其他输入流的基类,iostream,ostream,通用输出流类和其他输出流的基类,iostream,iostream,通用,I/O,流类和其他,I/O,流的基类,iostream,ifstream,输入文件流类,fstream,ofstream,输出文件流类,fstream,fstream,I/O,文件流类,fstream,istrstream,输入字符串流类,strstrea,m,ostrstream,输出字符串流类,strstream,strstream,I/O,字符串流类,strestram,表,1,I/O,类库中的常用流类,缓冲,缓冲区:,系统在主存中开辟的、用来临时存放输入/输出数据的区域。如先将输入的数据送到缓冲区,再从缓冲区中取出。,缓冲区的作用:,因输入/输出设备的速度比,CPU,慢得多,若,CPU,直接与外设交换数据,必然占用大量,CPU,时间,降低,CPU,的使用效率。使用缓冲后,,CPU,只要从缓冲区中取数据或者把数据写入缓冲区,而不必等待外设的具体输入/输出操作,显著提高了,CPU,的使用效率。,缓冲流和非缓冲流,按在缓冲区中是否立即处理,流分为,缓冲流,和,非缓冲流,。常用缓冲流,仅在特殊场合,才用非缓冲流。,非缓冲流:一旦数据送入缓冲区,立即处理。,缓冲流:仅当缓冲区满或当前送入的数据为新的一行字符时,系统才对流中的数据进行处理(称为刷新)。,文件的概念,文件是指存储在外部介质上且逻辑上有一定联系的一组数据的集合。,每个文件均有相应的,文件名,作为标志,文件的大小几乎是没有限制的。它在外存储介质上的具体存放位置、格式以及读写等工作均由操作系统来管理。,外存文件,包括磁盘文件、光盘文件和,U,盘文件等。,文件的分类,1,、从用户角度:程序文件和数据文件,程序文件:如,C+,的源程序文件,(.cpp),、目标文件,(.obj),和可执行文件,(.exe),等都是程序文件。,数据文件:指程序运行时需要的输入,(,或输出,),数据组成的文件。本章介绍的文件操作是指对,数据文件,的操作。,2,、,根据文件中数据的组织形式,,文件可分为两类:,文本文件,和,二进制文件,文本文件,(,也称为,ASCII,码文件,),,每个字节存放一个字符的,ASCII,码,也就是说,在文本文件中存取的,最小信息单位为字符,,因此也称为字符文件。,二进制文件,(,又称为内部格式文件或字节文件,),,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说,在二进制文件中存取的,最小信息单位为字节,。,文本文件和二进制文件举例,对于字符信息,在内存中是以,ASCII,码形式存放,因此无论用文本文件输出还是用二进制文件输出,其数据格式是一样的。但是对于数值数据,二者是不同的。例如对于整数,1234,,在两种文件中的存放格式如下:,00000100,11010010,内存中存储形式,ASCII,码文件存储形式,00110001,00110010,00110011,00110100,二进制文件存储形式,00000100,11010010,流式文件,?,C+,语言中把文件都看做“流式文件”,即无论文件内容是什么,一律看成是,由字符构成的序列,,即字符流。流式文件中的基本单位是字节,磁盘文件和内存变量之间的数据交换均以字节为基础。,缓冲文件处理方式,所谓,缓冲文件处理方式,就是在打开一个文件的同时,由系统自动地在内存中为该文件开辟一个“缓冲区”,用于临时存储内存和磁盘之间的交换数据;,如果一个程序同时打开多个文件,那么系统将自动地在内存中为每个文件开辟单独的缓冲区,,并编上相应的号码,便于进行操作时互不干扰。,文件的基本操作,文件的基本操作顺序:,打开、读取、写入、关闭,在程序设计中只要涉及对文件的操作,就一定要使用,#include,命令,二、文件的操作,1,、文件流类与文件流对象,C,+,中使用,流对象,(简称流)执行标准的输入和输出操作,。标准输入流对象,cin,指的是键盘,标准输出流对象,cout,指的是计算机屏幕。对使用标准输入和输出流对象的程序,必须包含,iostream.h,头文件。头文件包含,istream,和,ostream,类的定义,其中分别创建了,cin,和,cout,对象。程序员在程序中不必再创建这两个对象,直接使用即可。,除了可以从键盘获取信息以及将输出发送给计算机屏幕外,程序也能从磁盘上的文件接收信息或发出信息给磁盘上的文件。,从文件获取信息的操作称为“读取文件或读操作”,相应的数据文件称为“输入文件”;,向文件发出信息的操作称为“写入文件或写操作”,相应的数据文件称为“输出文件”。,可以,使用流对象来完成文件输入和输出操作,。和,C+,创建的标准,cin,和,cout,对象不同,程序员必须创建程序使用的输入和输出对象。,要创建文件对象,必须在程序中包含,fstream,头文件。,二、文件的操作,1,、打开文件,打开文件是指在文件读写之前做好必要的准备工作,包括:,1,、为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件;,2,、指定文件的工作方式,如该文件时作为输入文件还是输出文件,是,ASCII,文件还是二进制文件等。,打开文件方法一,在定义文件流对象时指定参数,格式如下:,ifstream,对象名,(“”,),;,该语句创建用于输入的文件对象。,ofstream,对象名,(“”,),;,该语句创建用于输出的文件对象。,fstream,对象名,(“”,),;,该语句创建既可用于输入又可用于输出的文件对象,打开文件方法二,使用输入和输出文件对象并结合,C+,的,open(),函数,,打开计算机硬盘上的实际文件。格式如下:,文件流,.,对象名;,对象名,.open(“”,);,mode,参数在,open(),函数为可选项,表明文件的打开方式,表,2,列出了最常用的方式。,表,2,常用的文件打开方式,方 式,作 用,ios:in,以输入方式打开文件,(,这是打开输入文件的默认方式,),。,ios:out,以输出方式打开文件,(,这是默认方式,),,如果已有此文件,则将其原有内容全部清除。如果文件不存在,则创建新文件,(,注意:指定的目录必须存在,否则建立文件失败,),ios:app,以输出方式打开文件,写入数据添加在文件末尾。,ios:binary,以二进制方式打开一个文件。,ios:in|ios:out,以输入和输出方式打开文件,文件可读可写。,3,、确定文件是否打开成功,可以使用,C+,的,is_open,(),函数确定文件是否成功打开。该函数调用的语法格式如下:,object.is_open,(),这里,object,是程序中文件对象名。如果成功打开了文件,,is_open,(),函数返回布尔值,true,;否则,函数返回布尔值,false,。,4,、关闭文件,使用,C+,的,close(),函数可关闭打开的文件。其调用的语法格式如下:,obect.close,();,及时关闭文件的好处:,及时释放所占资源;,使一个文件流对象可分时与多个文件关联;,使有限的可同时打开的文件总数得到充分利用。,源程序清单如下:,#include,#include,using namespace std;,void main(),ifstream,ifile1(e:testfile1.txt);,if(!ifile1),cout,打开文件,1,失败,endl;,else,cout,打开文件,1,成功,endl;,例,8.1,编写程序,完成打开一个文件及建立一个新文件。,ofstream,ofile2(e:testfile2.txt);,if(!ofile2)cout,打开文件,2,失败,endl;,elsecout,打开文件,2,成功,endl;,特别提示,:,文件的创建和打开也有可能不成功,而在进行读写操作前,必须明确文件已成功打开,否则,后续程序的执行将出错。,:,当,用,open,函数打开文件,,并对文件进行操作完成后,,需要使用,close,函数进行关闭文件,操作。但是,如果是采用创建文件流对象打开文件,并对文件进行操作完成后,可不必进行关闭文件的操作。,8.2,文本文件内容的操作,一个文件被打开以后,就与对应的流链接起来。对文件的读操作就是从流中提取元素;对文件的写操作,则是向流中插入元素。,C+,语言根据文件的数据格式提供了两种文件的打开模式:文本模式,(,默认模式,),和二进制模式。,以文本模式打开文件,即文本文件的打开操作,其对应的文件流方式与操作一般输入流、输出流的方式相似。,一、向输出文件,(,文本文件模式打开,),写入记录,向输出文件写入数据的语法格式如下:,object,datavariable;,姓名年龄性别,章易,22,男,陆耳,24,女,程善,25,男,李想,23,女,例,8.2,编写程序,创建一个文本文件,(file.txt),,并将如下信息写入该文件。,源程序清单如下:,#include,#include,using namespace std;,void main(),ofstream outFile;,outFile.open,(E:file.txt);,if(!,outFile.is_open(),),cout,打开文件失败,endl;,else,outFile,姓名,年龄,性别,endl;,outFile,章易,22,男,endl;,outFile,陆耳,24,女,endl;,outFile,程善,25,男,endl;,outFile,李想,23,女,endl;,outFile.close();,源程序清单如下:,#include,#include,#include,using namespace std;,例,8.3,编写程序,由键盘输入一个包含有大小写字母的字符串,例如“,This is a test.”,,并将其小写字母转换成大写后将其结果存入名为,abc.txt,的文本文件后,关闭文件;然后重新打开该文件,读取文件内容,并将其中的英文字母进行减,1,运算后输出到屏幕上。,void main(),char ch;int y=0;,fstream file1;,/,以输出方式打开文件,file1.open(e:abc.txt,ios:out);,if(!file1),cout,打开文件失败,endl;,exit(0),;,cout,请输入一个含有大小写字母的字符串,:n;,while(,ch=getchar(),)!=n),if(y=0),y=1;cout=a,coutch;,file1.put(ch),;,coutendl;,file1.close();,file1.open(f:vc+testabc.txt,ios:,in,);,cout=A,else coutch;,cout”),运算符在缺省情况下是跳过间隔符,(,包括空格、制表符和回车键等,),例如,修改上述程序中的第二个,while,循环如下,则运行结果改变。,while(file1ch),if(ch=A,else coutch;,特别提示:解决的办法是设置关闭跳过空格,即使用命令:,对象名,.unset(ios:skipws);,源程序清单如下:,#include,#include,#include,using namespace std;,void main(),char buf121;,fstream,file1;,例,8.4,编写程序:由键盘输入,5,个字符串,将其存入名为,a123.txt,的文本文件中,关闭文件;然后重新打开该文件,读取文件内容,并将其输出到屏幕。,/,以读和写方式打开文件,file1.open(e:a123.txt,ios:out|ios:in);if(!file1),cout,打开文件错误,endl;exit(0);,cout“n,请输入,5,个字符串,每串最多允许有,20,个字符,:n;,for(int i=0;ibuf1;,file1buf1#endl;,file1.close();,file1.open(f:a123.txt,ios:in);,while(!file1.eof(),file1.getline(buf1,20,#);,coutbuf1;,file1.close();,成员函数,getline(),功能:读取一行数据,格式:,对象名,.getline(,字符数组名,(,或者字符指针,),,串长度,,串结束位,),其中,“字符数组名”为,char*,类型,“串长度”为,int,型,“串结束位”为字符型,“串结束位”是可选项,其默认值为换行符,(n),。,特别提示:“串结束位”之前所含字符的个数不能超过“串长度”的限定,否则,将导致运行结果错误。,整行输入字符串举例,#include,#include,using namespace std;,void main(),char a20,b20;,cin.getline(a,5,);,/,cin.clear();,流出现错误就恢复,cin.getline(b,5,n);,coutaendlbendl;,运行结果,12345,6789,1234,5,67,二进制文件内容的操作,对二进制文件的读写主要用到,istream,类的成员函数,read,和,write,来实现,其中:,write,函数,:,把内存中的一块内容写到一个输出文件中,长度参数指出写的字节数。其调用语法格式如下:,object.write(char,*buffer,int len),;,其中,,object,是输出文件流对象名,字符指针,buffer,指向内存中一段存储空间,,len,是读写的字节数。,二进制文件内容的操作,read,函数,:,从一个文件读字节到一个指定的存储区域,由长度参数确定要读的字节数。如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时读结束。其函数调用语句的语法格式如下:,object.read(char,*buffer,int len);,其中,,object,是输入文件流对象名,字符指针,buffer,指向内存中一段存储空间,,len,是读写的字节数。,源程序清单如下:,#include,#include,using namespace std;,void main(),int date3=2007,12,21,dat3;,double pi=3.141596,p;,ofstream ofile(e:date.txt,ios:binary);,ofile.write(,(char*),date,sizeof(date);,ofile.write(,(char*),例,8.5,以二进制方式读写文件,ofile.close();,ifstream infile(e:date.txt,ios:binary);,infile.read(,(char*),dat,sizeof(dat);,infile.read(,(char*),coutdat0 dat1 dat2 pendl;,8.3,文件的随机读写,在一般情况下,以读取方式打开文件时,文件指针总是指向文件的开始处;以写方式打开文件时,文件指针总是指向文件的结束处。当读文件时,每读一个字节,文件指针就向后移动一个字符位置;当写文件时,每写一个字符,文件指针就移动到文件的结束处。这种文件指针的移动方式在文件的读写操作时有它不足之处。为了增加对文件读写的灵活性,,C+,的,istream,类和,ostream,类中定义了一些输入输出流中操作文件指针的成员函数,可以使程序设计者方便地操作指针。,一个文件实际上有两个指针,一个用于读,另一个用于写。,这些操作指针的函数分三类,即文件指针的相对移动函数、文件指针的定位函数和文件指针的绝对移动函数。,文件指针的相对移动,在,istream,类和,ostream,类中分别定义了不同的文件指针的相对移动函数,seekg(),和,seekp(),。它们的格式如下:,输入文件流对象,.seekg(,参数,1,,参数,2),;,输出文件流对象,.seekp(,参数,1,,参数,2),;,文件的随机读写,其中,参数,1,是指针移动的偏移量。为正表示指针向文件尾部移动,为负表示指针向文件头部移动。,参数,2,可以取以下三种:,ios:beg,文件头部,ios:end,文件尾部,ios:cur,当前文件指针的位置,例如:,infile.seekg(5,ios:cur);,infile.seekg(-5,ios:end);,outfile.seekp(0,ios:beg);,文件的随机读写,文件指针的定位函数,在,istream,类和,ostream,类中分别定义了不同的文件指针的定位函数,tellg(),和,tellp(),。它们的定义格式如下:,streampos inpos,outpos;,inpos=,输入文件流对象,.tellg();,outpos=,输出文件流对象,.tellp();,例如:,streampos inpos,outpos;,inpos=infile.tellg();,outpos=outfile.tellp();,文件的随机读写,文件指针的绝对移动,在,istream,类和,ostream,类中分别定义了不同的文件指针的绝对移动函数,seekg(),和,seekp(),,但它们只有一个参数。它们的格式如下:,输入文件流对象,.seekg(streanpos,对象,);,输出文件流对象,.seekp(streanpos,对象,);,例如:,streampos inpos;,inpos=infile.tellg();,infile.seekg(inpos);,文件的随机读写,例,8.6,有,5,个学生的数据,要求:,把他们存到磁盘文件中;,把磁盘文件中的第,1,,,3,,,5,个学生数据读入程序,并显示出来;,将第,3,个学生的数据修改后存回磁盘文件中的原有位置;,从磁盘文件中读入修改后的,5,个学生的数据并显示出来。,要实现以上要求,需要解决,3,个问题:,由于同一磁盘文件在程序中需要频繁地进行输入和输出操作,因此可将文件的工作方式指定为输入输出文件,即,ios:in|ios:out|ios:binary,。,正确计算好每次访问时指针的定位,即正确使用,seekg,或,seekp,函数,正确进行数据的重写,(,更新,),。,源程序清单如下:,#include,#include,#include,#include,using namespace std;,class student,private:,int x;,/,学号,string a;,/,姓名,double y;,/,成绩,public:,student(int i=0,const string b=,double z=0.0),x=i;a=b;y=z;,/,类的构造函数,void set(int i=0,const string b=,double z=0.0),x=i;a=b;y=z;,void disp(),coutxsetw(6)asetw(6)yendl;,;,void main(),student stud5=student(1001,Li,85),student(1002,Fun,97.5),student(1004,Wang,54),student(1006,Tan,76),student(1010,Ling,96);,student stud15;,/,用来存放从磁盘文件读入的数据,int i;,fstream iofile(e:teststud.txt,ios:in|ios:out|,ios:binary);,if(!iofile),coutopen error!endl;exit(0);,声明一个,对象数组,,并初始化,for(i=0;i5;i+),/,向磁盘文件输出,5,个学生的数据,iofile.write(char*),cout第1、3、5学生的数据为:endl;,for(i=0;i5;i+=2),/,定位于第,0,,,2,,,4,学生数据开头,iofile.seekg(i*sizeof(studi),ios:beg);,/*,先后读入,3,个学生的数据,存放在,stud10,stud11,和,stud12,中*,/,iofile.read(char*),/,输出,stud10,stud11,和,stud12,各成员的值,stud1i/2.disp();,coutendl;,/,修改第,3,个,(,序号为,2),学生的数据,stud2.set(1012,“Wu”,60);,/,定位于第,3,个学生的数据的开头,iofile.seekp(2*sizeof(stud0),ios:beg);,/,更新第,3,个学生的数据,iofile.write(char*),/,重新定位于文件开头,iofile.seekg(0,ios:beg);,cout,更新后的数据为,:endl;,for(i=0;i5;i+),iofile.read(char*),studi.disp();,iofile.close();,作业,完成习题本上第八章的作业。,
展开阅读全文

开通  VIP、SVIP  下载更划算
下载10份以上建议开通 VIP 会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        关注我们

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服