收藏 分享(赏)

第9章 文件.ppt

上传人:gnk289057 文档编号:8010558 上传时间:2019-06-04 格式:PPT 页数:65 大小:476KB
下载 相关 举报
第9章 文件.ppt_第1页
第1页 / 共65页
第9章 文件.ppt_第2页
第2页 / 共65页
第9章 文件.ppt_第3页
第3页 / 共65页
第9章 文件.ppt_第4页
第4页 / 共65页
第9章 文件.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、2019/6/4,1,第9章 文件,本章学习重点掌握内容: 文件的概念与类型 文件指针的概念 文件的打开与关闭 文件的读写 文件的定位 文件的检测,2019/6/4,2,第9章 文件,9.1 C语言文件概述 9.2 文件类型指针 9.3 文件的打开与关闭 9.4 文件的读写 9.5 文件的定位 9.6 文件的检测 9.7 常用的文件操作函数小结 9.8 程序设计举例,2019/6/4,3,9.1 C语言文件概述,所谓“文件”是指一组存储在外部介质(如磁盘)上,相关并具有独立意义数据的有序集合。 这个数据集有一个名称,叫做文件名。 文件通常是驻留在外部介质上的,在使用时才调入内存中来。作为数据集

2、合的文件,也是程序运行过程中进行数据输入或输出的一种形式。在程序运行时,常常需要将一些数据(例如程序运行的中间数据或最后的结果)输出到磁盘上存放起来,以后使用时由程序再从磁盘上调入内存,这时就要用到文件。,2019/6/4,4,9.1 C语言文件概述,从用户的角度来看,文件可分为普通文件和设备文件两种。普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备也可看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘

3、文件的读和写。,2019/6/4,5,9.1 C语言文件概述,从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件(二进制文件)两种。ASCII码文件又称为文本文件。ASCII文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,“15023”的存储形式为: ASCII码: 00110001 00110101 00110000 00110010 00110011 字符: 1 5 0 2 3二进制文件是按二进制的编码方式来存放文件的。 例如,“15023”这个数据的整型(int)存储形式为:00000000 00000000 00111010 10101111,只占

4、4个字节。,2019/6/4,6,9.1 C语言文件概述,ASCII文件与二进制文件的主要区别如下:它们的存储形式不同。从而导致同一个数据在这两种文件中所占用的存储空间大小也不同。在ASCII码存储方式中,数据所占的字节数是随着它的大小而变化的。二进制文件存储方式中,数据所占的字节数是由数据类型决定的。两种类型的读写速度也不一样。ASCII文件中数据的形式与内存中的数据存储形式不一样,因此在内外存数据交换时,需要进行数据存储形式的转换,而这种转换需要时间的。但二进制文件的数据存储形式是与内存中存储形式一样的,不需要转换。由于ASCII文件中一个字节就是一个ASCII码字符,因此ASCII文件可

5、以直接输出。但二进制文件中不是一个字节对应一个字符,不能直接输出,,2019/6/4,7,9.1 C语言文件概述,C语言对文件的处理有两种系统:缓冲区文件系统和非缓冲区文件系统。缓冲区文件系统是指系统自动地在内存为正在使用的每一个文件开辟一个内存缓冲区。从内存向磁盘输出的数据必须先送到这个缓冲区中,缓冲区被装满后或文件关闭时才一起送到磁盘上去。如果从磁盘向内存读入数据,则一次从磁盘文件中将一批数据送到内存缓冲区中,然后再从缓冲区逐个地将数据送到程序存储区供程序运行时用。非缓冲区文件系统是指缓冲区的大小和位置由程序员根据程序需要自行设定。,2019/6/4,8,9.2 文件类型指针,文件在使用时

6、一般都要被调到内存中,每个被使用的文件在内存中开辟一个存储区域,用来存放读写文件时所必须用的信息,如文件名,使用方式(读写等),当前位置等,这些信息是以一个结构体类型FILE(字母大写)的形式组织的,该定义包含在stdio.h中。,2019/6/4,9,9.2 文件类型指针,FILE结构体的定义如下: typedef struct short level; /*缓冲区“满”或“空”的程度*/unsigned flags; /*文件状态标志*/char fd; /*文件描述符*/unsigned char hold; /*如无缓冲区不读取字符*/short bsize; /*数据缓冲区的大小*/

7、unsigned char *buffer; /*数据缓冲区的位置*/unsigned char *curp; /*指针当前指向读写的位置*/unsigned istemp ; /*临时文件指示*/short token; /*用于有效性检查*/ FILE;,2019/6/4,10,9.2 文件类型指针,有了FILE文件数据类型,就可以定义文件类型变量。定义形式:FILE *指针变量名。如定义 FILE *fp。意思是定义一个指针变量fp,类型是FILE类型。常称这里的fp为文件类型指针。通过fp可以指向某一个存放文件信息的结构体变量,从而通过该结构体变量访问该文件。也就是说,通过文件指针变量

8、能够找到与它相应的文件,就可对它所指的文件进行操作(打开、关闭、读出、写入等)。习惯上也笼统地把fp称为指向一个文件的指针。如果同时操作多个不同的文件,应该定义多个不同名称的文件类型指针,并使得每个文件类型指针指向不同的文件。,2019/6/4,11,9.3 文件的打开和关闭,任何关于文件的操作都要先打开文件,再对文件进行读写, 操作完毕后,要关闭文件。9.3.1 文件的打开(fopen函数) fopen函数的调用方式通常为: FILE *fp; fp=fopen(“文件名”,“使用文件方式”); 功能:按使用方式打开指定文件,并将文件与文件指针建立联系。 返回值:成功,则返回文件结构体变量的

9、起始地址,否则返回一个空指针NULL(0)。 例如:FILE *fp;fp=fopen(“file1.dat“,“r“);,2019/6/4,12,9.3.1 文件的打开(fopen函数),注意:指定打开文件的路径时应用“”做为路径分隔符,两个反斜线“”是转义字符,表示反斜线。例如要打开磁盘C驱动器的根目录下的文本文件“abc.txt” 用于只读,应为 fp=fopen(“c:abc.txt”,“r”)。 所以打开一个文件时,通知编译系统以下3个信息:需要打开哪个文件;以何种方式打开该文件;让哪一个指针变量指向被打开的文件。,2019/6/4,13,9.3.1 文件的打开(fopen函数),使

10、用文件的方式有12种,见表9.1所示。,表9.1 使用文件方式,2019/6/4,14,9.3.1 文件的打开(fopen函数),说明: (1)文件使用方式由r、w、a、t、b、+,6个字符组成。r(read)表示只读,w(write)表示只写,a(append)表示追加,t(text)表示文本文件,可以省略不写,b(binary):表示二进制,+表示可读可写。 (2)用r方式打开的文件必须是已存在的。用w方式打开的文件无论是否存在,都将重新建立,若存在则先删除再新建。用a方式打开文件时,如果文件不存在,则建立,否则,文件中的位置指针移动文件尾,在文件原有内容末尾添加数据。含+时,该文件可读可

11、写。,2019/6/4,15,9.3.1 文件的打开(fopen函数),(3)对一个文件的打开不一定成功,出错的原因可能是用“r”方式打开一个并不存在的文件;若磁盘满或磁盘故障,试图用“w”方式建立一个文件也是不行的。如果出错,fopen函数将返回一个空指针值NULL。因此常用如下方式打开文件并测试返回值: if(fp=fopen(“file1.dat“,“r“)=NULL) printf(“Cannot open this file!n“ );exit(0); exit函数的作用是关闭所有文件,终止正在执行的程序,这时用户需要检查出错误的原因,再运行。,2019/6/4,16,9.3.1 文

12、件的打开(fopen函数),(4)向计算机输入文本文件时,把回车换行符转换成一个换行符,在输出时把换行符转换成回车和换行两个字符。(5)对于标准的输入输出文件,程序开始运行时,系统就自动把它们打开,即文件指针stdin指向标准输入文件(键盘),stdout指向标准输出文件(显示器)和stderr指向标准出错输出文件(也从显示器输出),用户不需要再打开。,2019/6/4,17,9.3.2 文件的关闭(fclose函数),文件关闭就是将文件与对应的文件指针“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。fclose函数的调用格式为: f

13、close(文件指针); 例如:fclose(fp); 功能:关闭fp所指向的文件,即fp不再指向该文件。 返回值:若关闭文件成功,返回函数值为0,否则返回EOF(1)。,2019/6/4,18,9.4 文件的读写,9.4.1 字符的读写(fgetc函数和fputc函数) 字符读写函数是以字符(字节)为单位的读写函数。每次可以从文件读出或向文件写入一个字符。 1读字符(fgetc函数) 从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。 fgetc函数的调用格式为: 字符变量=fgetc(文件指针); 例如:ch=fgetc(fp); 功能:从文件指针指向的文件中读取一个字符并将其保

14、存在字符变量中。 返回值:如果在执行fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标志EOF(1)。,2019/6/4,19,9.4.1 字符的读写(fgetc函数和fputc函数),例如:从磁盘文件顺序读入字符并输出到屏幕上,可以用以下语句:ch=fgetc(fp);while(ch!=EOF)putchar(ch); ch=fgetc(fp); 上面提到的EOF是一个常量,它是文件结束标志,有时也是文件操作出错的标志。其值为1,也是在头文件“stdio.h”中定义的一个宏: #define EOF 1 在文件操作中,常用它进行文本文件结束与否的测试。,2019/6/4,20,9

15、.4.1 字符的读写(fgetc函数和fputc函数),EOF不是可输出字符,不能在屏幕上显示。字符的ASCII码不可能出现1,因此对文本文件EOF定义为1是合适的。当读入的字符值等于1时,表示读入的已不是正常字符而是文件结束符。但是不能用它来测试一个二进制文件的结束与否,因为二进制文件中某一个数据的值可能是1,和EOF的值相同,这就出现把有用数据处理为“文件结束”的情况。为了解决这个问题,ANSI C提供了一个feof函数来判断二进制文件或文本文件是否真的结束。其形式为:feof(fp),用来测试fp所指向的文件当前状态是否是“文件结束”。如果文件结束,函数feof(fp)返回值为1,否则返

16、回值为0。,2019/6/4,21,9.4.1 字符的读写(fgetc函数和fputc函数),如果想顺序读入一个二进制文件中的数据,可以用: while(!feof(fp) ch=fgetc(fp); 当文件未结束时,feof(fp)的值为0,!feof(fp)的值为1,条件成立,读入一个字节的数据赋给变量ch,并接着对其进行所需的处理。直到文件结束,feof(fp)的值为1,!feof(fp)的值为0,条件不成立,不再执行while循环。 这种方法也适用于文本文件。,2019/6/4,22,9.4.1 字符的读写(fgetc函数和fputc函数),在文件内部有一个位置指针,用来指向文件的当前

17、读写字节。当文件打开时,该指针指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数,读取多个字符。注意:文件指针和文件内部的位置指针不是一回事。文件指针是FILE指针类型,指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针是unsinged char指针类型,用来指向文件的当前读写位置,每读写一次,该指针均向后移动,它不需要在程序中显式定义说明,而是由系统自动设置的。,2019/6/4,23,9.4.1 字符的读写(fgetc函数和fputc函数),2写字符(fputc函数) 把一个字符写入指定的文

18、件中,被写入的文件可以用写、读写、追加方式打开。 fputc函数的调用格式为: fputc(字符,文件指针); 例如:fputc(ch,fp); 功能:把内存中的一个字符(ch)写入到fp所指向的磁盘文件中去。待写入的字符可以是字符常量也可以是字符变量。 返回值:如写入成功则返回写入的字符,否则返回EOF(1)。每写入一个字符,文件内部位置指针向后移动一个字节。,2019/6/4,24,9.4.1 字符的读写(fgetc函数和fputc函数),3fgetc和fputc函数使用举例【例9.1】将键盘输入的一组字符(遇“#”结束)写入到磁盘文件中去,并将写入文件中的字符再输出到屏幕上。N-S图如图

19、9-1。,2019/6/4,25,#include #include #include void main( ) FILE *fp; char ch,filename10;cout“Input filename:“endl;gets(filename); /输入文件名if( fp=fopen(filename, “w“)=NULL) cout“Cant create this file!“endl;exit(0);cout“Please input text(# is end):“endl;while(ch=getchar( )!=#) /判断输入字符是否#fputc(ch,fp);fclos

20、e(fp);if( fp=fopen(filename, “r“)=NULL) cout“Cant open this file!“endl;exit(0);while(ch=fgetc(fp)!=EOF)putchar(ch);fclose(fp);,2019/6/4,26,9.4.1 字符的读写(fgetc函数和fputc函数),【例9.2】把一个磁盘文件中的内容复制到另一个磁盘文件中。N-S图如图9-2。,2019/6/4,27,#include #include #include void main( ) FILE *fp1,*fp2; char ch,inname10,outname

21、10;cout“Please input the infile name:”endl;gets(inname);cout“Please input the outfile name:”endl;gets(outname);if( fp1=fopen(inname, “r“)=NULL) /以读文本文件方式打开原有文件 cout“Cant open infile!“endl;exit(0);if( fp2=fopen(outname, “w“)=NULL) /以写文本文件方式打开目标文件 cout“Cant open outfile!“endl;exit(0);while(!feof(fp1)

22、ch=fgetc(fp1); /从原有磁盘文件中读一个字符fputc(ch,fp2); /把该字符写入目标磁盘文件fclose(fp1);fclose(fp2); ,2019/6/4,28,9.4.2 字符串的读写(fgets函数和fputs函数),1字符串输入(fgets函数) 其调用格式为: fgets(字符数组名,n,文件指针); 其中:n是一个正整数 例如:fgets(str,n,fp); 功能:从文件指针所指向的文件中读出n1个字符构成的字符串送到字符数组中。 返回值:成功则返回字符数组的首地址,否则返回空指针NULL。该函数从文件中读出n1个字符后,自动在串尾加上字符串结束标志0,

23、正好构成n个字符放到字符数组中。若在读完n1个字符之前遇到换行符或EOF,读入也结束。,2019/6/4,29,9.4.2 字符串的读写(fgets函数和fputs函数),2字符串输出(fputs函数) 其调用格式为: fputs(字符串,文件指针); 其中:字符串可以是字符串常量,也可以是字符数组名,或字符指针变量。功能:向文件指针指向的文件输出一个字符串,字符串末尾的0不输出。 返回值:成功时返回0,否则返回EOF。,2019/6/4,30,例如:fputs (“hello! “,fp);其意义是把字符串“hello! ”写入fp所指向的文件中。char c =“china“;fputs(

24、c,fp);其意义是把字符数组c 中的字符串写入fp所指向的文件中。char *p=“good morning“;fputs(p,fp);其意义是把字符指针p所指向的字符串写入fp所指向的文件中。,9.4.2 字符串的读写(fgets函数和fputs函数),2019/6/4,31,3fgets和fputs函数使用举例 【例9.3】修改例9.2,以字符串形式从文件中读写数据。N-S图如图9-3。,9.4.2 字符串的读写(fgets函数和fputs函数),2019/6/4,32,#include #include #include #define N 256 void main( ) FILE

25、*fp1,*fp2; char sN,inname10,outname10;cout“Please input the infile name:”endl;gets(inname);cout“Please input the outfile name:”endl;gets(outname);if( fp1=fopen(inname, “r“)=NULL) /以读文本文件方式打开原有文件 cout“Cant open infile!“endl;exit(0);if( fp2=fopen(outname, “w“)=NULL) /以写文本文件方式打开目标文件 cout“Cant open outf

26、ile!“endl;exit(0);while(fgets(s,N,fp1)!=NULL) /从原有磁盘文件中读取N1个字符 fputs(s,fp2); /将N1个字符写入目标磁盘文件中 fclose(fp1); fclose(fp2); ,2019/6/4,33,9.4.3 数据块的读写(fread函数和fwrite函数),1数据块输入(fread函数) 其调用格式为: fread(buffer,size,count,fp); 其中:buffer是一个指针,它表示读入数据的存放起始地址。size表示一个数据块所占空间的字节数。count表示要读的数据块的个数。fp表示文件指针。 功能:从fp

27、所指向的文件中读出count个size大小的数据到buffer指定的内存单元中去。 返回值:函数调用成功,返回count值,即个数。出错时返回1。 例如:fread(score,4,2,fp); 其中score是一个实型数组名。一个实型变量占4个字节。这个函数从 fp所指向的文件读入2个实数存入数组score中。,2019/6/4,34,9.4.3 数据块的读写(fread函数和fwrite函数),又如:有一个如下的结构体类型表示学生信息: struct student char name10; int num;float score; ; 为了表示某一班级的学生,声明结构体数组; stude

28、nt std30; 结构体数组std有30个元素,每一个元素用来存放一个学生的数据(包括姓名、学号、成绩)。假设学生的数据已经存放在磁盘文件中,并且fp文件指针已经指向该文件。可以用for语句和fread函数读入30个学生的数据: for(i=0;i30;i+)fread(,2019/6/4,35,2数据块输出(fwrite函数) 其调用格式为: fwrite(buffer,size,count,fp); 其中:buffer是一个指针,它表示要输出数据的起始地址。size表示一个数据块所占空间的字节数。count表示要读的数据块的个数。fp表示文件指针。 功能:从buffer为起始地址的内存中

29、取出count个size大小的数据写入到fp所指向的文件中。 返回值:函数调用成功,返回count值。出错时返回1。 一般地,用fread和fwrite函数进行读写操作时,文件应以二进制方式打开,这样输入输出都不会发生字符转换,从而保证原样读写。,9.4.3 数据块的读写(fread函数和fwrite函数),2019/6/4,36,3fread和fwrite函数使用举例 【例9.4】从键盘上输入N名学生的记录(学号、姓名、年龄、性别),存入磁盘文件STUDENTS.TXT中。再从文件中调出女生记录显示到屏幕上。N-S图如图9-4。,9.4.3 数据块的读写(fread函数和fwrite函数),

30、2019/6/4,37,【例9.4】从键盘上输入N名学生的记录(学号、姓名、年龄、性别),存入磁盘文件STUDENTS.TXT中。再从文件中调出女生记录显示到屏幕上。,#include #include #include #define N 5 struct student int num;char name10;int age;char sex; ;,2019/6/4,38,void main() int i;FILE *fp; student stdN; if(fp=fopen(“STUDENTS.TXT”,”wb+”)=NULL)/”wb+”即可写可读方式 coutstdi.numstd

31、i.namestdi.agestdi.sex;fwrite( ,2019/6/4,39,9.4.4 格式化的读写(fscanf函数和fprintf函数),1格式化输入(fscanf函数) 其调用格式为: fscanf(文件指针,“格式控制字符串”,输入项地址列表); 功能:从文件指针指向的文件中读取格式化的数据到指定的输入项中。 返回值:已输入的数据个数。例如:fscanf(fp, “%d %f“, 就是从fp所指向文件中读出一个整数和一个实数分别赋值给变量a和x。 值得注意的是在从文件中读出数据时,“格式控制字符串”的安排一定要与文件中数据存放的格式一致。,2019/6/4,40,2格式化输

32、出(fprintf函数) 其调用格式为: fprintf(文件指针,“格式控制字符串”,表达式列表); 功能:将表达式列表中的数据按指定格式要求存入到文件指针所指向的文件中。 返回值:实际输出的字符数。例如:fprintf (fp, “x=%dty=%6.2f “,x,y); 就是将变量x和y的值按指定格式写入到fp所指向的文件中。,9.4.4 格式化的读写(fscanf函数和fprintf函数),2019/6/4,41,前面的程序设计中,我们介绍过利用scanf和printf函数从键盘格式化输入及在显示器上进行格式化输出。fscanf和fprintf函数与scanf和printf函数的功能相

33、似,都是格式化读写函数,只是fscanf和fprintf函数的读写对象是磁盘文件(如果文件为标准输入文件stdin和标准输出文件stdout,则与scanf和printf函数作用相同)。标准的格式化输入输出函数: scanf(“格式控制字符串”,输入项地址列表); printf(“格式控制字符串”,表达式列表); 等价于: fscanf(stdin,“格式控制字符串”,输入项地址列表); fprintf(stdout,“格式控制字符串”,表达式列表);,9.4.4 格式化的读写(fscanf函数和fprintf函数),2019/6/4,42,9.5 文件的定位,为了从文件中正确的读写数据,C语

34、言在每个已打开的文件中都设置了一个位置指针,用于指示文件当前的读写位置。前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,每次读写一个字符(或字节)后,该位置指针就自动向后移动一个字符位置。顺序访问是系统自动实现的。但是,要想读写其中的某几个数据就要进行随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。,2019/6/4,43,9.5.1 位置指针复位(rewind函数),其调用格式为: rewind(文件指针); 功能:把文件内部的位置指针重新移到文件首。 返回值:无。,【例9.5】有一个磁盘文件,首先将它的内容显示在屏幕上,然后把它复制到另一个文件中。N-

35、S图如图9-5。,2019/6/4,44,【例9.5】有一个磁盘文件,首先将它的内容显示在屏幕上,然后把它复制到另一个文件中。,2019/6/4,45,#include #include #include void main( ) FILE *fp1,*fp2;if(fp1=fopen(“file1.cpp“, “r“)=NULL) cout“Cant open file1! “endl;exit(0);if(fp2=fopen(“file2.cpp“, “w“)=NULL) cout“Cant open file2! “endl;exit(0);while(!feof(fp1)putchar

36、(fgetc(fp1);/从fp1所指文件中读取一个字符再显示在屏幕上rewind(fp1);/文件位置指针重新指向文件首while(!feof(fp1) fputc( fgetc(fp1),fp2);/从fp1所指文件中读取一个字符再写入fp2所指文件fclose(fp1);fclose(fp2); ,2019/6/4,46,9.5.2 位置指针随机定位(fseek函数),对流式文件可以进行顺序读写,也可以进行随机读写。所谓随机读写,即读写数据的位置是用户自己决定的,不一定读写完上一个字节,就顺序读写后续字节。要实现随机访问,就必须在每次读写之前先确定位置,然后再读写。fseek函数就可以移

37、动文件内部位置指针到任意指定位置。其调用格式为: fseek(文件指针,位移量,起始点); 功能:将文件指针所指文件的位置指针以起始点为基准,移动“位移量”个字节数。 返回值:若移动成功,返回值为0,否则返回值为非0。,2019/6/4,47,9.5.2 位置指针随机定位(fseek函数),其中:“位移量”可以为正或负值。表示从起始点向前(文件尾方向)或向后(文件头方向)移动。位移量是长整型的数值,这样当位移量超过64KB时也不至于出现错误。当用常量表示位移量时,要求加后缀“L”。“起始点”有三个:文件开始、当前位置和文件末尾。可以选择标识符表示或数字表示。见表9.2所示。,表9.2 起始点表

38、示方法,2019/6/4,48,【例9.6】在磁盘文件students.dat上存有10个学生的数据(学号、姓名、年龄、性别)。要求将第2、4、6、8、10个学生数据读出并在屏幕上显示出来。N-S图如图9-6。,2019/6/4,49,#include #include #include struct student int num;char name10;int age;char sex; ; void save( );,【例9.6】在磁盘文件students.dat上存有10个学生的数据(学号、姓名、年龄、性别)。要求将第2、4、6、8、10个学生数据读出并在屏幕上显示出来。,2019/6

39、/4,50,void main() int i;FILE *fp;student std10; save( );if(fp=fopen(“students.dat”,”rb”)=NULL) cout“Cannot open this file.”endl;exit(0);for(i=1;i10;i+=2) fseek(fp,i*sizeof(student),0);fread( ,2019/6/4,51,void save( ) /从键盘上输入学生记录函数,创建磁盘文件:students.dat student std10;int i;FILE *fp;if(fp=fopen(“student

40、s.dat”,”wb”)=NULL) coutstdi.numstdi.namestdi.agestdi.sex;fwrite( ,2019/6/4,52,9.5.3 检测当前位置指针的位置(ftell函数),由于文件中的位置指针经常移动,人们往往不容易知道其当前位置在哪里。用ftell函数可以得到文件指针的当前位置。 其调用格式为: ftell(文件指针); 功能:检测当前位置指针的位置距离文件头有多少个字节的距离。 返回值:成功则返回值就是文件的当前位置,其位置用相对于文件头的位移量(长整型)来表示,如果出错,则返回值为1L。 例如:利用这个函数,可以测试一个文件的长度。 fseek(fp

41、,0L,2);/将位置指针移到文件尾 w=ftell(fp);/w中存入了文件尾到文件头的字节数,2019/6/4,53,9.6 文件的检测,9.6.1 文件读写错误检测(ferror函数)在调用各种输入输出函数(如fputc、fgetc、fread、fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数来检测。其调用格式为: ferror(文件指针); 功能:检查文件在用各种输入输出函数进行读写时是否出现错误。 返回值:该函数返回0表示未出错;返回非0表示出错。,2019/6/4,54,9.6.2 清除文件错误标志(clearerr函数),其调用格式为: cle

42、arerr(文件指针); 功能:使文件错误标志和文件结束标志都置为0。 返回值:无。假设在调用一个输入输出函数时出现错误,ferror函数值为一个非0值。在调用clearerr函数后,ferror函数值为0。只要出现错误标志就一直保留,直到对同一文件调用clearerr( )、rewind( )或任何其它一个输入输出函数。,2019/6/4,55,9.6.3 文件结束检测(feof函数),其调用格式为: feof(文件指针); 功能:用于测试是否读完文件中所有字节。 返回值:若位置指针指到文件尾,返回值为1;若位置指针没有指到文件尾,返回值为0。 当位置指针指到文件尾时,再顺序读取字符(或字节

43、)就是错误的。一般在读取数据之前,先进行测试是否还有数据可以读出。 例如:while(!feof(fp)读取数据处理数据,2019/6/4,56,9.7 常用的文件操作函数小结,2019/6/4,57,9.8 程序设计举例,【实例一】有5名职工,从键盘输入每名职工的数据(包括工号、姓名和四个季度的奖金),计算出全年奖金总数,将原有数据和计算出的全年奖金总数存入磁盘文件“zhigong.dat”中。N-S图如图9-7。,#include #include struct employee int num;char name10;int money4;int total; emp5;,2019/6/

44、4,58,void main() int i,j,sum; FILE *fp;for(i=0;iempi.num;coutempi.name;sum=0;for(j=0;jempi.moneyj;sum+= empi.moneyj;empi.total=sum;fp=fopen(“zhigong.dat”,”wb”); for(i=0;i5;i+)if(fwrite( ,2019/6/4,59,【实例二】将实例一“zhigong.dat”文件中的职工数据,按全年奖金总数进行降序处理,将已排序的职工数据存入一个新文件“zhg_sort.dat”中。N-S图如图9-8。,#include #inc

45、lude #include #define N 5 struct employee int num; char name10;int money4;int total; empN,change;,2019/6/4,60,void main() int i,j,n; FILE *fp;if(fp=fopen(“zhigong.dat”,”rb”)=NULL) cout“Cannot open this file.”endl;exit(0);coutendl “职工工资记录为:”;for(i=0;fread(,2019/6/4,61,n=i;for(i=0;in;i+) /采用降序法排序 for(

46、j=i+1;jn;j+)if(empi.totalempj.total) change=empi;empi=empj;empj=change;coutendl “全年奖金总数按降序排序后为:”;fp=fopen(“zhg_sort.dat”,”wb”);for(i=0;in;i+) fwrite( ,2019/6/4,62,【实例三】将实例二已经排序的职工奖金文件进行插入。插入一个职工的四个季度的奖金,程序先计算新插入职工的全年奖金总数,然后将它按全年奖金总数高低顺序插入,插入后建立一个新文件”sortnew.dat”。N-S图如图9-9。,#include #include #include

47、 struct employee int num;char name10;int money4;int total; emp5,aa;,2019/6/4,63,void main() int i,j,t,n;FILE *fp1,*fp2;coutaa.num;coutaa.name;coutaa.money0aa.money1 aa.money2 aa.money3;aa.total=aa.money0+aa.money1+aa.money2+aa.money3;if(fp1=fopen(“zhg_sort.dat”,”rb”)=NULL) cout“Cannot open this file.”endl;exit(0);,2019/6/4,64,coutaa.total,2019/6/4,65,fwrite( ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报