《C语言程序ppt课件ch.ppt》由会员分享,可在线阅读,更多相关《C语言程序ppt课件ch.ppt(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十一章1本本 章章 要要 点点掌握文件类型指针掌握文件类型指针(FILE类型指针类型指针)掌握文件的打开与关闭掌握文件的打开与关闭(fopen,fclose)掌握文件的读写掌握文件的读写211.1 C11.1 C文件概述文件概述1.1.定义:定义:文件是指存储在外部介质上数据的集合。文件是指存储在外部介质上数据的集合。操作系统是以操作系统是以文件文件为单位对数据进行管理的。为单位对数据进行管理的。每一个与主机相连的输入或输出设备都看作是一每一个与主机相连的输入或输出设备都看作是一个文件。个文件。2.2.结构:结构:字符(字节)序列,即由一个个字符(字节)字符(字节)序列,即由一个个字符(字节
2、)的数据顺序组成的数据顺序组成,对文件的存取是以字符(字节)对文件的存取是以字符(字节)为单位的,这类文件称为为单位的,这类文件称为流式文件。流式文件。33.3.组织形式:组织形式:ASCII ASCII码(文本)文件和二进制文件码(文本)文件和二进制文件ASCIIASCII码(文本)文件码(文本)文件:文件的每一个字节放一个:文件的每一个字节放一个ASCIIASCII代码,代表一个字符。代码,代表一个字符。二进制文件:二进制文件:把内存中的数据按其在内存中的存把内存中的数据按其在内存中的存储形式原样输出到磁盘文件上。储形式原样输出到磁盘文件上。4.输入和输出方式输入和输出方式缓冲文件系统:缓
3、冲文件系统:系统自动在内存区为每一个正在使系统自动在内存区为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存的缓冲区中,装满缓冲区后在一起送必须先送到内存的缓冲区中,装满缓冲区后在一起送到磁盘中去。如果从磁盘向内存读入数据,则一次从到磁盘中去。如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然后再从缓磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。冲区逐个地将数据送到程序数据区。4非缓冲文件系统:非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而由程系统不自动开辟确定大小的
4、缓冲区,而由程序为每个文件设定缓冲区。序为每个文件设定缓冲区。对文件的读写操作通过库函数实现。对文件的读写操作通过库函数实现。程序数据区输出文件缓冲区输入文件缓冲区磁盘511.2 11.2 文件类型指针文件类型指针定义:定义:缓冲文件系统中,获取内存中存放文件有缓冲文件系统中,获取内存中存放文件有关信息的结构体的指针定义为文件类型指针。通关信息的结构体的指针定义为文件类型指针。通过文件指针变量能找到指定的文件,以实现对文过文件指针变量能找到指定的文件,以实现对文件的访问。件的访问。结构体类型结构体类型 FILE FILE 每个被使用的文件都在内存中开辟一个区,用每个被使用的文件都在内存中开辟一
5、个区,用来存放文件的有关信息(如文件名,状态,当前来存放文件的有关信息(如文件名,状态,当前位置等)。这些信息保存在一个结构体类型的变位置等)。这些信息保存在一个结构体类型的变量中。量中。6结构体类型由系统定义为结构体类型由系统定义为“FILEFILE”。有的有的C C版本在版本在 stdio.hstdio.h文件中有如下定义文件中有如下定义typedef structtypedef struct int _fd;int _fd;;/*/*文件号文件号 */*/int _cleft int _cleft;/*/*缓冲区中剩下的字符缓冲区中剩下的字符 */*/int _mode int _mod
6、e;/*/*文件操作模式文件操作模式 */*/char*_nexttc;/*char*_nexttc;/*下一个字符位置下一个字符位置*/*/char *_buff;/*char *_buff;/*文件缓冲区位置文件缓冲区位置*/*/FILE;FILE;7例:例:定义一个定义一个FILEFILE类型的数组类型的数组FILE -efile-MAXFILE;FILE -efile-MAXFILE;-MAXFILE:-MAXFILE:数组元素个数,也就是可使用文件的数组元素个数,也就是可使用文件的最大数目。最大数目。例:定义一个文件指针变量例:定义一个文件指针变量FILE *fp;FILE *fp;
7、fpfp是一个指向是一个指向FILEFILE结构体的指针变量。可以使结构体的指针变量。可以使 fpfp指向某一个具体文件的结构体变量,通过读指向某一个具体文件的结构体变量,通过读取该结构体变量中的有关信息来实现对文件的取该结构体变量中的有关信息来实现对文件的访问和操作。访问和操作。也就是通过也就是通过fp fp 指定要被访问的指定要被访问的文件文件。8文件的一般操作过程文件的一般操作过程 打开文件打开文件 建立用户程序与文件的联系建立用户程序与文件的联系 操作文件操作文件 对文件进行读、写、追加等操作对文件进行读、写、追加等操作 关闭文件关闭文件 切断文件与程序的联系切断文件与程序的联系911
8、.3 11.3 文件的打开与关闭文件的打开与关闭 文件的打开(函数文件的打开(函数 fopen fopen)功能:在对文件读写之前打开文件。功能:在对文件读写之前打开文件。调用方式调用方式:FILE *fpFILE *fp;fp=fopen(fp=fopen(文件名文件名,使用文件方式);使用文件方式);返回值:指定文件的指针,若失败返回返回值:指定文件的指针,若失败返回 NULL NULL三要素:三要素:文件指针,文件名,使用方式文件指针,文件名,使用方式例:fp=fopen(“m1”,”r”);fp=fopen(“m1”,”r”);表示打开名为m1的文件,使用方式为“读入”.10 文件使用
9、方式文件使用方式文件使用方式文件使用方式11 文件使用方式文件使用方式12 进行文件读写的一般规则进行文件读写的一般规则if if 读文件读文件 指定的文件必须存在,否则出错;指定的文件必须存在,否则出错;if if 写文件(指定的文件可以存在,也可以不存在)写文件(指定的文件可以存在,也可以不存在)(1)(1)以以“w”“w”方式写:方式写:if if该文件已经存在该文件已经存在 原文件将被删去然后重新建立;原文件将被删去然后重新建立;else else 按指定的名字新建一个文件;按指定的名字新建一个文件;(2)(2)以以“a”“a”方式写:方式写:if if该文件已经存在该文件已经存在 写
10、入的数据附加在原数据后边;写入的数据附加在原数据后边;else else 按指定的名字新建一个文件(与按指定的名字新建一个文件(与“w”“w”相同);相同);(3)(3)文件同时读和写:文件同时读和写:使用使用“r+”“r+”、“w+”“w+”、“a+”“a+”打开文件。打开文件。1311.3.2 11.3.2 11.3.2 11.3.2 文件的关闭(函数文件的关闭(函数文件的关闭(函数文件的关闭(函数 fclose fclose fclose fclose)功能:使用文件之后关闭文件。使文件指针变量功能:使用文件之后关闭文件。使文件指针变量不再指向该文件。不再指向该文件。调用方式:调用方式:
11、fclose(fclose(文件指针);文件指针);返回值:关闭成功返回返回值:关闭成功返回 0 0,若失败返回,若失败返回 非零值非零值。例:例:fclose fclose(fpfp);在程序结束之前关闭所有使用的文件,如果不在程序结束之前关闭所有使用的文件,如果不关闭文件可能会丢失数据。用关闭文件可能会丢失数据。用fclosefclose关闭文件,关闭文件,将缓冲区的数据输出到磁盘后再释放文件指针变将缓冲区的数据输出到磁盘后再释放文件指针变量,可避免数据丢失。量,可避免数据丢失。1411.4 11.4 文件的读写文件的读写11.4.1 11.4.1 格式化读写函数格式化读写函数 fscan
12、f fscanf 功能:功能:将指定磁盘文件格式化赋给指定对象将指定磁盘文件格式化赋给指定对象。fprintf fprintf 功能:功能:将指定对象格式化输出到指定磁盘文件上。将指定对象格式化输出到指定磁盘文件上。格式格式:fprintf fprintf(文件指针,格式字符串,输出表列)文件指针,格式字符串,输出表列)fscanf fscanf(文件指针,格式字符串,输入表列)文件指针,格式字符串,输入表列)例:例:fscanf(fp,”%d%f”,&i,&a);fscanf(fp,”%d%f”,&i,&a);从从fpfp所指向的文件中,取出数据赋给所指向的文件中,取出数据赋给i i和和a.
13、a.fprintf(fp,”%d,%f”,a,b);fprintf(fp,”%d,%f”,a,b);将将a a和和b b的值按指定格式写入到的值按指定格式写入到fpfp所指向的文件中。所指向的文件中。1511.4.2 fputc11.4.2 fputc函数和函数和fgetcfgetc函数函数fputc fputc 功能:功能:把一个字符写到把一个字符写到fpfp所所指向的磁盘文件指向的磁盘文件中。中。格式:格式:fputc(ch,fp);fputc(ch,fp);文件类型指针变量要输出的字符 fgetc 功能:功能:从指定磁盘文件读从指定磁盘文件读出出一个字符,该文件必须一个字符,该文件必须
14、是以读或读写的方式打开的。是以读或读写的方式打开的。格式:格式:ch=fgetc(fp);文件类型指针变量字符变量若读到文件尾结束符时,函数返回一个文件结束标志EOF(值为-1)。可用feof(fp)处理文件是否结束,为1结束,否则为0。若写成功,函数返回该字符,否则返回一个文件结束标志EOF(值为-1)。16例:将一个磁盘文件中的信息复制到另一个磁盘文件中。例:将一个磁盘文件中的信息复制到另一个磁盘文件中。#include“stdio.h”#include“stdio.h”main()main()FILE*in,*out;FILE*in,*out;char ch,infile10,outfi
15、le10;char ch,infile10,outfile10;printf(“%Enter the infile name:n”);printf(“%Enter the infile name:n”);scanf(“%s”,infile);scanf(“%s”,infile);printf(“Enter the outfile name:n);printf(“Enter the outfile name:n);scanf(“%s”,outfile);scanf(“%s”,outfile);17if(in=fopen(infile,“r”)=NULL)if(in=fopen(infile,“r
16、”)=NULL)printf(“cannot open infilen”);printf(“cannot open infilen”);exit(0);exit(0);if(out=fopen(outfile,”w”)=NULL)if(out=fopen(outfile,”w”)=NULL)printf(“cannot open infilen”);printf(“cannot open infilen”);exit(0);exit(0);while(!feof(in)fputc(fgetc(in),out);while(!feof(in)fputc(fgetc(in),out);fclose
17、(in);fclose(in);fclose(out);fclose(out);值为1数据读取结束1811.4.3 fread11.4.3 fread函数和函数和fwritefwrite函数函数fread fread 功能:功能:从指定磁盘文件读入一组数据从指定磁盘文件读入一组数据。格式:格式:fread(buffer,size,count,fp);fread(buffer,size,count,fp);要读写的字节数指针,即读入数据的存放地址文件类型指针变量要进行读写多少个size字节的数据项例:例:fread(a,2,3,fp);a数组名,从数组名,从fp所指向的文件中读出所指向的文件中读
18、出3次次数据,每次数据,每次2个个字节,字节,存入存入a数组中。数组中。19 fwrite 功能:功能:把一组数据写到指定磁盘文件上。把一组数据写到指定磁盘文件上。格式:格式:fwrite(buffer,size,count,fp);20例如:假设学生的数据已存放在磁盘文件中,可用以例如:假设学生的数据已存放在磁盘文件中,可用以下下forfor语句和语句和freadfread函数读入函数读入4040个学生的数据。个学生的数据。for(i=0;i40;i+)for(i=0;i40;i+)fread(&studi,sizeof(struct student_type),fread(&studi,s
19、izeof(struct student_type),1,fp);1,fp);可用以下的可用以下的forfor语句和语句和fwritefwrite函数将内存中函数将内存中4040个学生的个学生的数据输出到磁盘文件中去。数据输出到磁盘文件中去。for(i=0;i40;i+)for(i=0;i40;i+)fwrite(&studi,sizeof(struct student_type),fwrite(&studi,sizeof(struct student_type),1,fp);1,fp);2111.4.4 fgets11.4.4 fgets函数和函数和fputsfputs函数函数fgets f
20、gets 功能:功能:从文件从文件读入一个指定的字符串到内存中读入一个指定的字符串到内存中。例例:fgets(str,n,fp);:fgets(str,n,fp);从从fpfp指向的文件读出一个具有指向的文件读出一个具有n-1n-1个字符的字符串个字符的字符串,存入其始地址为存入其始地址为strstr的内存中的内存中.fputs fputs 功能:功能:将指定的字符串输出到将指定的字符串输出到fpfp所指向的文件中所指向的文件中.fputs(str,fp);fputs(str,fp);22 例例:已已有有文文本本文文件件test.txt,内内容容为为Hello,everyone!,以以下下程程
21、序序中中文文件件test.txt已已正正确确为为读读而而打打开开,由由文文件件指指针针fr指指向向该该文文件件,则则程程序序输出结果为输出结果为_.#include main()FILE*fr;char str40;fgets(str,5,fr);printf(%sn,str);fclose(fr);Hell从从frfr指向的文件读出一个具有指向的文件读出一个具有5-15-1个字符的字符串个字符的字符串,存入其始存入其始地址为地址为strstr的内存中的内存中.23例例:将两个变量的数值写入将两个变量的数值写入test.txt test.txt。#include “stdio.h”#inclu
22、de “stdio.h”main()main()FILE*fpFILE*fp;int i=3;float t=4.5;int i=3;float t=4.5;if(fp=fopen(“test.txt”,“w”)=NULL)if(fp=fopen(“test.txt”,“w”)=NULL)printf(“file open failed”);printf(“file open failed”);exit(0);exit(0);fprintf(fp,”%d,%6.2f”,i,t);fprintf(fp,”%d,%6.2f”,i,t);fclose(fp);fclose(fp);运行结果:test
23、.txt 的内容是3,4.50定义文件指针变量写入i,t 关闭文件24例:例:现有某校理学院现有某校理学院20072007级级8 8班的三十名学生的成绩数据班的三十名学生的成绩数据(包括学号,姓名,三门课成绩,平均成绩),存(包括学号,姓名,三门课成绩,平均成绩),存放在放在data08.txtdata08.txt文件中。编写程序从文件读入以文件中。编写程序从文件读入以上数据,计算出每名学生的平均成绩,再将成绩上数据,计算出每名学生的平均成绩,再将成绩数据存放在数据存放在data08_a.txtdata08_a.txt文件中。文件中。25#include stdio.h#include std
24、io.hstruct studentstruct student long num;long num;char name8;char name8;int score3;int score3;float avr;float avr;stu30;stu30;main()main()int i,j,sum;int i,j,sum;FILE*fp1;FILE*fp1;/*/*读文件读文件*/*/if(fp1=fopen(data08.dat,r)=NULL)if(fp1=fopen(data08.dat,r)=NULL)printf(Cannot open file!);return 0;printf
25、(Cannot open file!);return 0;for(i=0;i30;i+)for(i=0;i30;i+)fscanf(fp1,%ld%s%d%d%d,&stui.num,stui.name,&stufscanf(fp1,%ld%s%d%d%d,&stui.num,stui.name,&stui.score0,&stui.score1,&stui.score2);i.score0,&stui.score1,&stui.score2);26/*/*计算计算*/*/for(i=0;i30;i+)for(i=0;i30;i+)sum=0;sum=0;for(j=0;j3;j+)for(j
26、=0;j3;j+)sum+=stui.scorej;sum+=stui.scorej;stui.avr=sum/3.0;stui.avr=sum/3.0;/*/*写文件写文件*/*/if(fp1=fopen(data08_a.txt,w)=NULL)if(fp1=fopen(data08_a.txt,w)=NULL)printf(Cannot open file!);return 0;printf(Cannot open file!);return 0;for(i=0;i30;i+)for(i=0;i30;i+)fprintf(fp1,%ld%s%d%d%d fprintf(fp1,%ld%s
27、%d%d%d%fn,stui.num,stui.name,stui.score0,stui.%fn,stui.num,stui.name,stui.score0,stui.score1,stui.score2,stui.avr);score1,stui.score2,stui.avr);fclose(fp1);fclose(fp1);27检测文件指针函数:检测文件指针函数:feof()feof()调用一般形式:调用一般形式:feof(fp);feof(fp);功能:检测文件指针是否到文件尾,若到文功能:检测文件指针是否到文件尾,若到文件尾,函数值为真(非件尾,函数值为真(非0 0),否则为假。),否则为假。exit(0):exit(0):系统标准函数,作用是关闭所有打系统标准函数,作用是关闭所有打开的文件,并终止程序的执行。开的文件,并终止程序的执行。参数参数0 0表示程序正常结束,非表示程序正常结束,非0 0参数通常表示参数通常表示不正常的程序结束。不正常的程序结束。28
限制150内