资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
12.1 概述 12.2 文件和流 12.3 顺序文件的访问 12.4 随机文件的访问,第12章 文件处理,over,文件一般指存储在外部介质上的数据集合,操作系统以文件为单位对数据进行 管理。磁盘上的文件称为磁盘文件。对磁盘文件的输入/输出简称为文件I/O。 C+语 言中没有文件输入/输出语句,对文件的读写是用流或C+的库函数来实现。 在C+语言中,用扩展名h表示头文件,用扩展名cpp表示源程序文件,用扩展 名obj表示程序文件被编译后生成的目标文件,用扩展名exe表示连接目标文件后形 成的可执行文件。对于用户建立的用于保存数据的文件,通常用dat作扩展名,若它 是由字符构成的文本文件,则可用txt作为扩展名。 在C+中,按存储格式可以把文件分为两种类型:ASCII码文件或文本文件; 内部格式文件或二进制文件。两种存储格式所占用的存储空间不同。用ASCII码形 式输出与字符一一对应,一个字节代表一个字符。用二进制形式输出数据,可以节 省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。 根据存取方式可以把文件分为顺序存取文件和随机存取文件。,12.1 概述,return,12.2.1 打开文件 12.2.2 关闭文件,12.2 文件和流,return,打开文件操作包括建立文件流对象,与外部文件关联,指定文件的打 开方式。打开文件有两种方式: (1)首先建立流对象,然后调用函数open连接外部文件。格式为: 流类 对象名; 对象名.open(文件名,方式); (2)调用流类带参数的构造函数,建立流对象的同时连接外部文件。 语句格式为: 流类 对象名(文件名,方式); 其中,“流类”是流类库中定义的文件流类,ifstream用于读方式打开文 件,ofstream用于写方式打开文件,而fstream用于读/写方式打开文件。 “方式”是ios定义的标识常量,表示文件的打开。 open函数的函数原型为: void open( const char* szName, int nMode, int nProt = filebuf:openprot ); 其中,“szName”是文件名,它可包含驱动器符和路径说明;“nMode” 说明文件打开方式,表12.1给出了nMode的取值范围。,12.2.1 打开文件,表12.1 文件打开方式,return,关闭文件操作主要是将缓冲区数据完整地写入文件,添加文件结束标志, 使文件流与对应的物理文件断开联系。关闭文件时,调用fstream的成员函数 close()。 【例12.1】打开文件和关闭文件举例。 #include “iostream.h“ #include “fstream.h“ void main() ofstream outfile(“d:f1.txt“,ios:out); if(!outfile) cerr“打开文件错误!“endl; else outfile120endl; outfile310.65endl; outfile.close(); ,12.2.2 关闭文件,程序执行结果为在D盘上建立f1.txt文件,文件内容为: 120 310.65,return,12.3.1 建立顺序文件 12.3.2 读取顺序文件中的数据 12.3.3 更新顺序文件中的数据,12.3 顺序文件的访问,return,如果对文件的操作总是从文件指针位置开始顺序向后移动,就称之为顺序 文件。 1建立文本文件 文件打开后,就可以用文件流对象和插入操作符向文件中写入数据。其使 用方法与标准I/O完全类似。例如: outputfile“This is the beginning of file I/O“endl; 可根据需要打开不同模式的文件,例如: fstream outputfile; outputfile.open(“test.dat“,ios:out|ios:in); /输入输出文件 fstream outputfile; outputfile.open(“test.dat“,ios:out|ios:binary); /二进制输出文件 fstream outputfile(“test.dat“,ios:app); /添加方式输出文件,12.3.1 建立顺序文件,【12.2】使用操作器、设置标志位和成员函数向输出文件中输出文本。 #include #include #include void main(void) fstream output; output.open(“d:datatest.dat“,ios:out); if(output.fail() cerr“Can not open test.dat“endl; /打开文件错误时,给出错误提示 abort(); /终止程序运行 outputsetiosflags(ios:left)setw(13)“Name“setw(10)“Class“ setw(10)“Age“endl; outputsetiosflags(ios:left)setw(13)“Zhang san“ setw(10)10setw(10)21endl;,outputsetiosflags(ios:left)setw(13)“Li Si“setw(10)10 setw(10)19endl; outputsetiosflags(ios:left)setw(13)“Wang Wu“setw(10)10 setw(10)20endl; outputsetiosflags(ios:left)setw(13)“Zhao Liu“setw(10)10 setw(10)22endl; for(char ch=a;ch=z;ch+) output.put(ch); output.write(“n1234567890“,11); output.close(); ,输出到d:datatest.dat文件中的数据为: Name Class Age Zhang San 10 21 Li Si 10 19 Wang Wu 10 20 Zhao Liu 10 22 abcdefghijklmnopqrstuvwxyz 1234567890,2建立二进制文件 当程序对文件中数据读写速度要求很高时,用二进制文件比 较合适。例如大量读写浮点数、整数或数据结构。 为执行二进制文件操作,必须首先使用ios:binary模式指示符 打开文件。下面的语句为二进制输出在当前路径中打开名为 binary_data的文件: fstream outfile(“binary_data.dat“,ios:out|ios:binary); 应使用read和write成员函数来执行二进制文件的输入输出操 作。不能使用插入操作符向二进制文件中输入 /输出数据,否则可能会遇到莫名其妙的错误,得不到正确的结 果。,【12.3】打开一个二进制文件并向其中写入数据。 #include #include void main(void) fstream output; output.open(“d:databinary_data.dat“,ios:out|ios:binary); if(!output) cerr“Can not open binary_data.dat“endl; abort(); double x=3.1415926,6.2831852,9.4247778,12.5663704,15.707963; for(int i=0;i5;i+) output.write(char*) ,return,1读取文本文件 【12.4】读取文件内容到显示器。 #include #include void main(void) fstream input(“d:datatest.dat“,ios:in); if(input.fail() cerr“Can not open test.dat“endl; abort(); while(!input.eof() cout.put(char)input.get(); ,12.3.2 读取顺序文件中的数据,2读取二进制文件 【12.5】读写二进制文件。该程序先打开输入文件,在文件中输入二进制数 据,关闭文件。然后再打开该文件,从中读取二进制数据并显示在屏幕上。 #include #include #include void main(void) fstream output; output.open(“d:databinary_data.dat“,ios:out|ios:binary); if(!output) cerr“Can not open binary_data.dat“endl; abort(); double x=3.1415926,6.2831852,9.4247778,12.5663704,15.707963; for(int i=0;i5;i+) output.write(char*),fstream input(“d:databinary_data.dat“,ios:in|ios:binary); double z5; if(input.fail() cerr“Can not open binary_data.dat“endl; abort(); for(i=0;i5;i+) input.read(char*) ,运行程序,输出结果为: 3.1415926 6.2831852 9.4247778 12.5663704 15.707963,return,对于一个已经存在的文件,可以用添加的方式修改文件的 内容。例如,有一份学生成绩单,需要在后面追加一些记录。 文件打开模式为: fstream outapp(“d:datatest.dat“,ios:app); /数据始终输出到文件尾部 fstream outapp(“d:datatest.dat“,ios:ate); /数据输出到尾部,文件指针可移动 fstream outapp(“d:datatest.dat“,ios:trunc); /删除文件中存在的数据,输出新数据,12.3.3 更新顺序文件中的数据,return,12.4.1 建立随机文件 12.4.2 读取随机文件中的数据 12.4.3 数据写入随机文件,12.4 随机文件的访问,return,程序读写完一个数据后,通过移动文件指针,读写文件中其他位置的数据。 这就是所谓的随机访问文件。如果同时为读写操作打开文件,程序就可将读文件 指针移到一个位置,而将写文件指针移向另一位置,二者互不干扰。 对于随机文件,可以按任何顺序进行读写操作。所以,随机文件特别适合于 对二进制文件的操作。 使用seekg和seekp两个重载成员函数控制文件指针。seekg用于输入文件, seekp用于输出文件。seekg函数和seekp函数的格式如下: seekg(offset,dir); 或 seekg(pos); seekp(offset,dir); 或 seekp(pos); 其中,offset参数指定了新的位移值(以字节为单位),为long型;pos参数 指定文件指针的新位置;dir参数指定了文件中读位移量的起始位置,必须是下列 枚举值之一: ios:beg:从文件起始位置开始。 ios:cur:从当前文件指针位置开始。 ios:end:从文件结束位置开始。,12.4.1 建立随机文件,例如: iuput.seekg(250L,ios:beg); /将读取文件指针移到离文件开头25
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号