您好,欢迎访问三七文档
-HNUSS-湖南长沙.湖南大学软件学院第九部分文件处理内容数据层次文件和流2019/12/17数据层次粒度从小到大比特(位/Bit)1or0稳定的电路Characterset字符集–数字、字母和专门的符号字节(Byte:8bits)1个字符型数据的存储单元(char)程序员以字符为单位建立程序和数据项,计算机按位模式操作和处理这些字符数据层次域(Field/字段):一组有意义的字符name记录(Record):一组相关域的组合classinC++一个学生的信息:name、no、college、hometown记录关键字(key):唯一标识、检索文件:相关记录的集合社团的成员联系表班级的年度学习成绩统计表数据库(Database):相关文件的集合全校的学生基本信息表数据层次2019/12/17101001010JudyJudyGreenSallyBlackTomBlueJudyGreenIrisOrangeRandyRedFileRecordFieldByte(ASCIIcharacterJ)Bit文件和流文件:字节流Endswithend-of-filemarker流:数据从一个对象流动到另一个对象,这种流动抽象为流。cina;couta;03124589......n-1end-of-filemarker67C++流的继承结构ios:对流状态进行设置,虚基类;streambuf:提供对数据的缓冲支持;istream、ostream、iostream:提取与插入cin:istream类对象,处理标准输入,即键盘输入;cout:ostream类对象,处理标准输出,即屏幕输出;cerr:ostream类对象,处理标准出错信息,提供不带缓冲区的输出;clog:ostream类对象,处理标准出错信息,提供带缓冲区的输出;iosstreambufistreamostreamiostreamC++文件流的继承结构fstreambase:虚基类;filebuf:提供对文件的缓冲支持;ifstream、ofstream、fstream:写入与读出fstreambasefilebufifstreamofstreamfstream字符文件和二进制文件字符文件:又称ASCII文件或文本TEXT文件以一个字节存放一个ASCII码,代表一个字符。例如,32767需要使用5个字节表示,即:5150555455(十进制表示的ASCII),而浮点数136.56需要使用6个字节表示,即495154465354。二进制文件是指以数据在内存中存储形式原样输出(存放)到文件上去,例136.56是一个float型实数,它在内存中占有4个字节长度。将该4个字节按其在内存中的原来形式存放到文件中。无论该float型数有多大,都只占用4个字节。2019/12/17数据存在形式2019/12/1701111111111111110011001100111110001101110011011000110111二进制文件中保存方式ASCII文件中的存在方式3(51)2(50)7(55)6(54)7(55)整数32767在内存中的存储形式文件操作为了调用磁盘文件,缓冲文件系统为每一个文件开辟了一个“文件信息区”,用来存放与文件操作有关的信息。在C++中,头文件fstream.h中定义了文件类(型),包括:ifstream:它支持从输入文件中提取数据的各种操作ofstream:它支持把数据写入文件中的各种操作;fstream:支持数据的输入与输出操作使用上述对象需要#includefstream2019/12/17打开文件方式一ifstreaminfile;ofsreamoutfile;fstreamfile;infile.open(“myfile_in.txt”);//打开一个只读文件outfile.open(“myfile_out.txt”);//打开一个只写文件file.open(“myfile.txt”,ios::in);//以只读方式打开方式二ifstreaminfile(“myfile_in.txt”);ofstreamoutfile(“myfile_out.txt”);fstreamfile(“myfile.txt”,ios::in);2019/12/17打开文件相关选项2019/12/17枚举常量名含义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指定文件以二进制方式打开,而不是缺省说明的文本方式。打开文件相关选项每一种打开方式是以一个二进制位来表示的,所以可以用二进制位或运算“|”将允许的几种方式组合起来使用。如//打开一个输出文件并将指针移到文件尾fstreamfile(“myfile.txt”,ios::out|ios::ate);//打开一个二进制文件用于输入fstreamfile(“myfile.txt”,ios::in|ios::binary);//打开一个输出文件并清除原有内容fstreamfile(“myfile.txt”,ios::out|ios::trunc);2019/12/17文件操作的保护在打开文件后,通常要判断打开是否成功。若打开成功,则文件类对象的值为非零值;若打开不成功,则其值为0。为此,打开文件的格式可以写为:ifstreamf1(“file.dat”);if(!f1)//打开文件失败{cout“不能打开文件:”“file.dat”‘\n’;}else//成功打开文件{……;}2019/12/17打开文件后务必需要检查文件状况样例程序2019/12/17例:编写程序,读取源程序文件并复制到目的文件中去。#includeiostream#includefstreamusingnamespacestd;intmain(){charfilename_in[256],filename_out[256];cout输入源文件名:;cinfilename_in;cout输入目的文件名:;cinfilename_out;ifstreaminfile(filename_in);if(!infile){cout不能打开输入文件:filename_in'\n';exit(-1);}ofstreamoutfile(filename_out);if(!outfile){cout不能打开输出文件:filename_out'\n';exit(-2);}infile.unsetf(ios::skipws);//设置为不要跳过文件的空格charch;while(infilech)//当到达文件结尾时,infilech的返回值为0,结束循环;outfilech;//否则其返回值不为0,继续循环。infile.close();outfile.close();return0;}其他解决方案处理文件复制问题的另外两个方案:方案2:(适用于任何类型的文件)charch;//成员函数完成从源文件中字符读取,while(infile.get(ch))//这样将不会自动跳过空格。outfile.put(ch);//将ch中的字符写到目的文件中。infile.close();outfile.close();方案3:(只适用于文本文件)charbuff[300];while(infile.getline(buff,300))//从源文件中读取一行,不含‘\n’outfilebuff'\n';//字符;infile.close();outfile.close();2019/12/17二进制文件操作C++的文件类对象可能通过成员函数read()和write()实现对二进制文件的读写操作是的,函数的原型为:read(char*buf,intsize);功能:从文件中读取由size所指定的字节数据到buf所指向的存储单元中。write(char*buf,intsize);功能:将由buf所指向的存储单元中的size个字节数据写入到文件中。2019/12/17向文件输出2到500之间的偶数#includeiostream#includefstreamusingnamespacestd;intmain(int){ofstreamoutfile(d:\\data.txt,ios::out|ios::binary);if(!outfile){cout不能打开输出文件:data.dat\n;exit(-1);}for(inti=2;i=500;i+=2)outfile.write((char*)&i,sizeof(int));outfile.close();return0;}2019/12/17以二进制模式输出至c:\data.txt文件将整数的地址转换成字符型指针向文件输出2到500之间的偶数#includeiostream#includefstreamusingnamespacestd;intmain(int){ifstreaminfile(d:\\data.txt,ios::binary);if(!infile){cout不能打开输入文件:data.dat\n;exit(-1);}inta[250];infile.read((char*)a,sizeof(int)*250);for(inti=0;i250;i++){couta[i]'\t';if((i+1)%10==0)cout'\n';}cout'\n';infile.close();system(pause);return0;}2019/12/17以二进制模式输出至d:\data.txt文件将整数的地址转换成字符型指针随机文件访问在文件信息区中存在一个用于指示当前文件读取位置的指针变量,称为文件定位指针,C++语言不仅允许按文件中信息的先后顺序来进行读写,同时也允许从文件中的任何位置开始进行数据的读写操作,这种读写方式就称为文件的随机访问。C++的istream和ostream类中分别提供了几个支持文件随机访问的成员函数。2019/12/17istreamistream(输入文件)类:seekg(longstreampos);将文件定位指针移动到strampos所指定的位置。seekg(longstreamoff,seek_dir);将文件定位指针按seek_dir确定的方向移动streamoff位置;tellg();返回输入文件中,文件定位指针当前的位置。2019/12/17ostreamostream(输出文件)类:seekp(longstreampos);将文件定位指针移动到strampos所指定的位置。seekp(longstreamoff,seek_dir);将文件定位指针按seek_dir确定的方向移动streamoff位置;tellp();返回输出文件中,文件定位指针当前的位置。2019/12/17Seek_dir枚举常量值功能ios::beg0文件开头ios::cur1文件指针的当前位置ios::end2文件尾文件
本文标题:C++文件操作
链接地址:https://www.777doc.com/doc-2076563 .html