资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,-,HNUSS,-,湖南长沙,.,湖南大学软件学院,程序设计基础,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,*,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,C,+,+,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,介绍,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第九部分,文件处理,.,介绍,内容,数据层次,文件和流,2025/11/9 周日,.,数据层次,粒度从小到大,比特,(位/Bit),1 or 0,稳定的电路,Character set字符集,数字、字母和专门的符号,字节,(Byte:8 bits),1个字符型数据的存储单元(char),程序员以字符为单位建立程序和数据项,计算机按位模式操作和处理这些字符,.,数据层次,域,(Field/字段):一组有意义的字符,name,记录(Record):一组相关域的组合,class,in C+,一个学生的信息:,name、no、college、hometown,记录关键字(key):唯一标识、检索,文件:相关记录的集合,社团的成员联系表,班级的年度学习成绩统计表,数据库(Database):相关文件的集合,全校的学生基本信息表,.,数据层次,1,01001010,Judy,Judy,Green,Sally,Black,Tom,Blue,Judy,Green,Iris,Orange,Randy,Red,File,Record,Field,Byte,(ASCII character J),Bit,2025/11/9 周日,.,文件和流,文件:字节流,Ends with,end-of-file,marker,流:数据从一个对象流动到另一个对象,这种流动抽象为流。,cina;,couta;,0,3,1,2,4,5,8,9,.,.,n-1,end-of-file marker,6,7,.,C+流的继承结构,ios:对流状态进行设置,虚基类;,streambuf:提供对数据的缓冲支持;,istream、ostream、iostream:提取与插入,cin,:,istream类对象,处理标准输入,即键盘输入;,cout,:,ostream类对象,处理标准输出,即屏幕输出;,cerr,:,ostream类对象,处理标准出错信息,提供不带缓冲区的输出;,clog,:,ostream类对象,处理标准出错信息,提供带缓冲区的输出;,ios,streambuf,istream,ostream,iostream,.,C+文件流的继承结构,fstreambase:虚基类;,file,buf:提供对文件的缓冲支持;,i,f,stream、o,f,stream、,f,stream:写入与读出,fstreambase,filebuf,ifstream,ofstream,fstream,.,字符文件和二进制文件,字符文件,:又称,ASCII,文件或文本,TEXT,文件,以一个字节存放一个,ASCII,码,代表一个字符。例如,,32767,需要使用,5,个字节表示,即,:51 50 55 54 55(,十进制表示的,ASCII),,而浮点数,136.56,需要使用,6,个字节表示,即,49 51 54 46 53 54,。,二进制文件,是指以数据在内存中存储形式原样输出(存放)到文件上去,例,136.56,是一个,float,型实数,它在内存中占有,4,个字节长度。将该,4,个字节按其在内存中的原来形式存放到文件中。无论该,float,型数有多大,都只占用,4,个字节。,2025/11/9 周日,.,数据存在形式,01111111,11111111,00110011,00111110,00110111,00110110,00110111,二进制文件中保存方式,ASCII,文件中的存在方式,3(51),2(50),7(55),6(54),7(55),整数,32767,在内存,中的存储形式,2025/11/9 周日,.,文件操作,为了调用磁盘文件,缓冲文件系统为每一个文件开辟了一个,“,文件信息区,”,,用来存放与文件操作有关的信息。,在,C+,中,头文件,fstream.h,中定义了文件类(型),包括:,ifstream,:它支持从输入文件中提取数据的各种操作,ofstream,:它支持把数据写入文件中的各种操作;,fstream,:支持数据的输入与输出操作,使用上述对象需要,#include,2025/11/9 周日,.,打开文件,方式一,ifstream infile;,ofsream outfile;,fstream file;,infile.open(“myfile_in.txt”);/,打开一个只读文件,outfile.open(“myfile_out.txt”);/,打开一个只写文件,file.open(“myfile.txt”,ios:in);/,以只读方式打开,方式二,ifstream infile(“myfile_in.txt”);,ofstream outfile(“myfile_out.txt”);,fstream file(“myfile.txt”,ios:in);,2025/11/9 周日,.,打开文件相关选项,枚举常量名,含义,ios:in,打开文件用于输入(读)操作。如果文件存在,将不被截掉,文件定位指针位于文件首,新的数据可写到文件中任何位置。,ios:out,打开文件用于输出(写)操作。如果文件存在,并且没有设置,ios:app,,,ios:ate,,,ios:in,值,则文件被截掉。,ios:ate,如果文件存在,将不被截掉。文件定位指针位于文件尾,新的数据可写到文件中任何位置。,ios:app,如果文件存在,将不被截掉。文件定位指针位于文件尾,新的数据附加到文件尾(不可重写已存在的文件数据)。,ios:trunc,如果文件已存在,则被截为,0,;如果指定,ios:out,,同时没有设置,ios:app,ios:ate,ios:in,,则该模式是隐含的。,ios:nocreate,如果文件不存在,则打开文件失败(不创建新文件)。,ios:noreplace,如果文件存在,打开时只能设置为,ios:ate,及,ios:app,方式。,ios:binary,指定文件以二进制方式打开,而不是缺省说明的文本方式。,2025/11/9 周日,.,打开文件相关选项,每一种打开方式是以一个二进制位来表示的,所以可以用二进制位或运算“,|”,将允许的几种方式组合起来使用。如,/,打开一个输出文件并将指针移到文件尾,fstream file(“myfile.txt”,ios:out|ios:ate);,/,打开一个二进制文件用于输入,fstream file(“myfile.txt”,ios:in|ios:binary);,/,打开一个输出文件并清除原有内容,fstream file(“myfile.txt”,ios:out|ios:trunc);,2025/11/9 周日,.,文件操作的保护,在打开文件后,通常要判断打开是否成功。若打开成功,则文件类对象的值为非零值;若打开不成功,则其值为,0,。为此,打开文件的格式可以写为:,ifstream f1(“file.dat”);,if(!f1),/,打开文件失败,cout“,不能打开文件:”,“file.dat”n;,else/,成功打开文件,;,打开文件后务必需要检查文件状况,2025/11/9 周日,.,样例程序,例:编写程序,读取源程序文件并复制到目的文件中去。,#include,#include,using namespace std;,int main(),char filename_in256,filename_out256;,coutfilename_in;,coutfilename_out;,ifstream infile(filename_in);,if(!infile)cout,不能打开输入文件,:filename_inn;exit(-1);,ofstream outfile(filename_out);,if(!outfile)cout,不能打开输出文件:,filename_outch)/,当到达文件结尾时,,infilech,的返回值为,0,结束循环;,outfilech;/,否则其返回值不为,0,,继续循环。,infile.close();,outfile.close();,return 0;,2025/11/9 周日,.,其他解决方案,处理文件复制问题的另外两个方案:,方案,2,:(适用于任何类型的文件),char ch;,/,成员函数完成从源文件中字符读取,,while(infile.get(ch)/,这样将不会自动跳过空格。,outfile.put(ch);,/,将,ch,中的字符写到目的文件中。,infile.close(,);,outfile.close(,);,方案,3,:(只适用于文本文件),char buff300;,while(infile.getline(buff,300)/,从源文件中读取一行,不含,n,outfilebuffn;/,字符;,infile.close(,);,outfile.close(,);,2025/11/9 周日,.,二进制文件操作,C+,的文件类对象可能,通过成员函数,read(),和,write(),实现对二进制文件的读写操作是的,函数的原型为:,read(char*buf,int size);,功能:从文件中读取由,size,所指定的字节数据到,buf,所指向的存储单元中。,write(char*buf,int size);,功能:将由,buf,所指向的存储单元中的,size,个字节数据写入到文件中。,2025/11/9 周日,.,向文件输出2到500之间的偶数,#include,#include,using namespace std;,int main(int),ofstream outfile(,d:data.txt,ios:out|ios:binary);,if(!outfile),cout,不能打开输出文件:,data.datn;,exit(-1);,for(int i=2;i=500;i+=2),outfile.write(char*),outfile.close();,return 0;,以二进制模式输出至,c:data.txt,文件,将整数的地址转换成字符型指针,2025/11/9 周日,.,向文件输出2到500之间的偶数,#include,#include,using namespace std;,int main(int),ifstream infile(d:data.txt,ios:binary);,if(!infile)cout,不能打开输入文件:,data.datn;,exit(-1);,int a250;,infile.read(char*)a,sizeof(int)*250);,for(int i=0;i250;i+),coutait;,if(i+1)%10=0)coutn;,coutn;,infile.close();,system(pause);,return 0;,以二进制模式输出至,d:data.txt,文件,将整数的地址转换成字符型指针,2025/11/9 周日,.,随机文件访问,在文件信息区中存在一个用于指示当前文件读取位置的指针变量,称为文件定位指针,,C+,语言不仅允许按文件中信息的先后顺序来进行读写,同时也允许从文件中的任何位置开始进行数据的读写操作,这种读写方式就称为文件的随机访问。,C+,的,istream,和,ostream,类中分别提供了几个支持文件随机访问的成员函数。,2025/11/9 周日,.,istream,istream,(输入文件)类:,seekg(long streampos);,将文件定位指针移动到,strampos,所指定的位置。,seekg(long streamoff,seek_dir);,将文件定位指针按,seek_dir,确定的方向移动,streamoff,位置;,tellg();,返回输入文件中,文件定位指针当前的位置。,2025/11/9 周日,.,ostream,ostream,(输出文件)类:,seekp(long streampos);,将文件定位指针移动到,strampos,所指定的位置。,seekp(long streamoff,seek_dir);,将文件定位指针按,seek_dir,确定的方向移动,streamoff,位置;,tellp();,返回输出文件中,文件定位指针当前的位置。,Seek_dir,枚举常量值,功能,ios:beg,0,文件开头,ios:cur,1,文件指针的当前位置,ios:end,2,文件尾,2025/11/9 周日,.,文件指针移动,infile.seekg(500);,/,文件定位指针移到距文件头,500,个字节处,infile.seekg(-100,ios:cur);,/,文件定位指针从当前位置前移,100,个字节,infile.seekg(100,ios:cur);,/,文件定位指针从当前位置后移,100,个字节,outfile.seekp(-100,ios:end);,/,文件定位指针从文件尾开始前移,100,个字节,前移:指文件定位指针从文件尾向文件头方向移动(,streamoff,为负值);,后移:指文件定位指针从文件头向文件尾方向移动;,移动文件指针时,必须保证移动后的指针值大于,0,且小于等于文件尾字节编号,否则将导致接着的输入输出操作失败。,2025/11/9 周日,.,随机访问样例,#include,#include,using namespace std;,int main(),ofstream outfile(d:data.txt,ios:out|ios:binary);,for(int i=5;i1000;i+=2),outfile.write(char*),outfile.close();,ifstream infile(d:data.txt,ios:in|ios:binary);,int x;,infile.seekg(20*sizeof(int);,for(int j=0;j10;j+),infile.read(char*),coutxn;,infile.close();,system(pause);,return 0;,从文件头向后移动,80,个字节,读取一个整数,产生一个,51000,之间的奇数文件(二进制文件),将文件中的第,2030,之间的数读出后输出。,2025/11/9 周日,.,随机访问样例,#include,#include,using namespace std;,Int main(),int num,i;,fstream fp;,fp.open(d:data.txt,ios:in|ios:out|ios:binary);,if(!fp),coutfile cant open!;,exit(-1);,fp.seekg(-(long)sizeof(int),ios:end);,fp.read(char*),for(i=num+2;i=99;i+=2),fp.write(char*),fp.close();system(“pause”);return 0;,从文件尾向前移动一个整数,写入一个整数,d,盘上已经存在一个二进制格式的文件,其中存放了由,1,开始的公差为,2,的一批数,下面的程序判断这批数的最后一个是否是,99,,如果不是的话,则在文件中已有的数的基础上以相同的规律将数补充到,99,为止。,2025/11/9 周日,.,Thank you,.,介绍,
展开阅读全文