1
第九讲 C 面向对象程序设计(六)
严宣辉
数学与计算机科学学院\rE-mail:yanxuanhui@fjnu.edu.cn
2
内容提要
3.11 文件流操作
3
3.11 文件流
3.11.1 文件的概念和分类\r 文件是指存储在存储介质上的数据的集合。C 将文件看作是由一个一个字符(字节)的数据顺序组成的。\r 按照文件中数据的存放形式可以将文件分为:ASCII文件和二进制文件。
4
3.11.2 文件的读写与文件指针
“文件指针”是指表示读写文件的文件位置指示器。一个文件指针总是和一个文件相关联,当文件每一次打开时,文件指针都指向文件的开始,随着对文件进行操作,文件指针不断地在文件中移动,并一直指向最新处理的字符(字节)位置。\r对文件的读写操作方式有两种方式:顺序文件操作和随机文件操作。\r
5
与文件处理相关的类及其继承关系结构图
6
文件操作包括打开文件、读写文件和关闭文件3个步骤 。\r 文件的打开和关闭是通过使用fstream类的成员函数open和close来实现的。fstream类的头文件是fstream.h \r\r1. 打开文件\r 打开文件应使用成员函数open(),该成员函数的函数原型为:\rvoid open(const unsigned char *szName , int nMode , int nProt =filebuf::openprot);
7
其中: szName是一个字符型指针,指定了要打开的文件名; nMode指定文件的打开方式,见下表。 nProt指定了文件的系统属性,其取值为:\r0??????????0 一般文件\r1??????????1 只读文件\r2??????????2 隐藏文件\r3??????????3 系统文件
8
在ios类中定义的文件打开方式
9
几点说明:
(1)在实际使用过程中,可根据需要将以上打开文件的方式用“|”组合起来。如:\r ios::in|ios::out表示以读/写方式打开文件\r ios::in|ios::binary表示以二进制读方式打开文件\r ios::out|ios::binary表示以二进制写方式打开文件\r ios::in|ios::out|ios::binary表示以二进制读/写方式打开文件\r\r(2)如果未指明以二进制方式打开文件,则默认是以文本方式打开文件。
10
2. 关闭文件
在文件操作结束时应及时调用成员函数close()来关闭文件。如:要关闭的文件对象名为myfile,则可使用如下语句关闭文件:\r myfile.close();
11
3. 文件的读写
在打开文件后就可以对文件进行读写操作了。从一个文件中读出数据,可以使用iostream类的get、getline、read成员函数以及运算符“>>”;而向一个文件写入数据,可以使用其put、write函数以及插入符“<<”。
12
iostream的文件操作常用的函数
13
3.11.3 顺序文件的操作
从文件的第一个字符(字节)开始顺序地处理到文件的最后一个字符(字节) ,这种操作方式只能从文件的开始处依次顺序读写文件内容,而不能任意读写文件内容。\r【例3.11-1】 向顺序文件的读写操作\r P147 【例Ex_File 】
14
【例3.11-2 】有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组存到磁盘文件中.\r#include “fstream.h”\rint main( )\r{int a[10];\r ofstream outfile(″f1.dat″,ios::out);\r //定义文件流对象,打开磁盘文件″f1.dat″\r if(!outfile) //如果打开失败,outfile返回0值\r {cout<<″open error!″< 15 cout<<″enter 10 integer numbers:″< 16 运行情况如下: \renter 10 integer numbers:\r1 3 5 2 4 6 10 8 7 9 ↙\r\r请注意: 在向磁盘文件输出一个数据后,要输出一个(或几个)空格或换行符,以作为数据间的分隔,否则以后从磁盘文件读数据时,10个整数的数字连成一片无法区分。 17 【例3.11_3 】从例3.11_2建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。\r#include “fstream.h”\rint main( )\r{int a[10],max,i,order;\r ifstream infile(“f1.dat”,ios::in|ios::nocreate);\r//定义输入文件流对象,以输入方式打开磁盘文件f1.dat\r if(!infile)\r {cout<<“open error!”< 18 for(i=0;i<10;i )\r {infile>>a[i];\r //从磁盘文件读入10个整数,顺序存放在a数组中\r cout< 19 for(i=1;i<10;i )\r if(a[i]>max)\r {max=a[i]; //将当前最大值放在max中\r order=i; //将当前最大值的元素序号放在order中\r }\r cout<<″max=″< 20 3.11.4 随机文件操作 随机文件操作,即在文件中通过C 相关的函数移动文件指针,并指向所要处理的字符(字节)。\r (1)在istream类中提供了3个操作读指针的成员函数:\ristream