1、共 28 页 第 1 1 页共 28 页 第 2 2 页掌握文件类型指针掌握文件类型指针 (FILE类型指针类型指针)掌握文件的打开与关闭掌握文件的打开与关闭 (fopen, fclose)掌握文件的读写掌握文件的读写共 28 页 第 3 3 页1.1.定义:定义: 文件是指存储在外部介质上数据的集合。文件是指存储在外部介质上数据的集合。 操作系统是以操作系统是以文件文件为单位对数据进行管理的。为单位对数据进行管理的。 2.2.文件结构:文件结构: 字符(字节)序列,即由一个个字符(字节字符(字节)序列,即由一个个字符(字节)的数据顺序组成)的数据顺序组成, ,对文件的存取是以字符(字对文件的
2、存取是以字符(字节)为单位的,这类文件称为节)为单位的,这类文件称为流式文件。流式文件。共 28 页 第 4 4 页3. 3. 组织形式:组织形式: ASCIIASCII码(文本)文件和二进制文件码(文本)文件和二进制文件 ASCIIASCII码(文本)文件码(文本)文件:文件的每一个字节放一个:文件的每一个字节放一个ASCIIASCII代码,代表一个字符。代码,代表一个字符。 二进制文件:二进制文件:把内存中的数据按其在内存中的存把内存中的数据按其在内存中的存储形式原样输出到磁盘文件上。储形式原样输出到磁盘文件上。共 28 页 第 5 5 页 定义:定义: 文件类型指针文件类型指针 对文件的
3、访问。对文件的访问。 结构体类型结构体类型 FILEFILE 每个被使用的文件都在内存中开辟一个区,用每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件名,状态,当前来存放文件的有关信息(如文件名,状态,当前位置等)。这些信息保存在一个结构体类型的变位置等)。这些信息保存在一个结构体类型的变量中。量中。共 28 页 第 6 6 页结构体类型由系统定义为结构体类型由系统定义为“FILEFILE”。 有的有的C C版本在版本在 stdio.hstdio.h文件中有如下定义文件中有如下定义typedef structtypedef struct int _fd int _fd; ;
4、; / /* * 文件号文件号 * */ / int int _cleft _cleft; / /* * 缓冲区中剩下的字符缓冲区中剩下的字符 * */ / int int _mode _mode; / /* * 文件操作模式文件操作模式 * */ / char char * *_nexttc_nexttc; /; /* * 下一个字符位置下一个字符位置 * */ / char char * *_buff; /_buff; /* * 文件缓冲区位置文件缓冲区位置 * */ / FILE;FILE;共 28 页 第 7 7 页FILE FILE * *fpfp; ; 通过通过fpfp 指定要被访
5、问的文件指定要被访问的文件。文件的一般操作过程文件的一般操作过程 打开文件打开文件 建立用户程序与文件的联系建立用户程序与文件的联系 操作文件操作文件 对文件进行读、写、追加等操作对文件进行读、写、追加等操作 关闭文件关闭文件 切断文件与程序的联系切断文件与程序的联系共 28 页 第 8 8 页11.3.111.3.1 文件的打开(函数文件的打开(函数 fopenfopen) 功能:在对文件读写之前打开文件。功能:在对文件读写之前打开文件。 调用方式调用方式: FILE FILE * *fpfp; fp=fopenfp=fopen( (文件名文件名, ,使用文件方式);使用文件方式); 返回值
6、:指定文件的指针,若失败返回返回值:指定文件的指针,若失败返回 NULLNULL 三要素:三要素:文件指针,文件名,使用方式文件指针,文件名,使用方式例: FILE FILE * *fpfp; fpfp=fopen(“m1”,”r”);=fopen(“m1”,”r”);表示打开名为m1的文件,使用方式为“读入”.共 28 页 第 9 9 页文件使用方式文件使用方式 含含 义义 “r” (只读) 为输入打开一文本文件 “w” (只写) 为输出打开一文本文件 “a” (追加) 向文本文件尾加数据 “rb (只读) 为输入打开一二进制文件 “wb” (只写) 为输出打开一二进制文件 “ab” (追加
7、) 向二进制文件尾加数据 r+” (读写) 为读/写打开一文本文件共 28 页 第 1010 页文件使用方式文件使用方式 含含 义义 “w+” (读写) 为读/写建立一个新文本文件 “a+” (读写) 为读/写打开一文本文件 “rb+” (读写) 为读/写打开一二进制文件 “wb+ (读写) 为读/写建立一新二进制文件 “ab+” (读写) 为读/写打开一二进制文件共 28 页 第 1111 页 进行文件读写的一般规则进行文件读写的一般规则读文件读文件 指定的文件必须存在,否则出错;指定的文件必须存在,否则出错;写文件(指定的文件可以存在,也可以不存在)写文件(指定的文件可以存在,也可以不存在
8、) (1)(1)以以“w”w”方式写:方式写: 如果该文件已经存在如果该文件已经存在 原文件将被删去然后重新建立;原文件将被删去然后重新建立; 否则否则 按指定的名字新建一个文件;按指定的名字新建一个文件; (2)(2)以以“a”a”方式写:方式写: 如果该文件已经存在如果该文件已经存在 写入的数据附加在原数据后边;写入的数据附加在原数据后边; 否则否则 按指定的名字新建一个文件(与按指定的名字新建一个文件(与“w”w”相同);相同); (3)(3)文件同时读和写:文件同时读和写: 使用使用“r+”r+”、“w+”w+”、“ “ a+”a+”打开文件。打开文件。共 28 页 第 1212 页
9、功能:使用文件之后关闭文件。使文件指针变量功能:使用文件之后关闭文件。使文件指针变量不再指向该文件。不再指向该文件。 调用方式:调用方式: fclosefclose( (文件指针);文件指针); 返回值:关闭成功返回返回值:关闭成功返回 0 0,若失败返回,若失败返回 非零值非零值。例:例: fclose fclose (fpfp); ; 在程序结束之前关闭所有使用的文件,如果在程序结束之前关闭所有使用的文件,如果不关闭文件可能会丢失数据。用不关闭文件可能会丢失数据。用fclosefclose关闭文件关闭文件,将缓冲区的数据输出到磁盘后再释放文件指针,将缓冲区的数据输出到磁盘后再释放文件指针变
10、量,可避免数据丢失。变量,可避免数据丢失。共 28 页 第 1313 页11.4.1 11.4.1 格式化读写函数格式化读写函数 fscanffscanf 功能:功能:将指定磁盘文件格式化赋给指定对象将指定磁盘文件格式化赋给指定对象。 fprintffprintf 功能:功能:将指定对象格式化输出到指定磁盘文件上。将指定对象格式化输出到指定磁盘文件上。格式格式:fprintffprintf (文件指针,格式字符串,输出表列)文件指针,格式字符串,输出表列)fscanffscanf (文件指针,格式字符串,输入表列)文件指针,格式字符串,输入表列)例:例:fscanf(fp,”%d%f”,&i,
11、&afscanf(fp,”%d%f”,&i,&a);); 从从fpfp所指向的文件中,取出数据赋给所指向的文件中,取出数据赋给i i和和a.a. fprintf(fp,”%d, %f”,a,b fprintf(fp,”%d, %f”,a,b);); 将将a a和和b b的值按指定格式写入到的值按指定格式写入到fpfp所指向的文件中。所指向的文件中。共 28 页 第 1414 页例例: : 将两个变量的数值写入将两个变量的数值写入test.txt test.txt 。# include stdio.h# include stdio.h void main( )void main( )FILE F
12、ILE * *fpfp; ;intint i=3; i=3; float t=4.5;float t=4.5; if (fp=fopen(test.txt if (fp=fopen(test.txt, w) = NULL), w) = NULL) printf printf (file open failed); (file open failed); exit(0); exit(0); fprintf(fp,%dfprintf(fp,%d %6.2f, i, t ); %6.2f, i, t );fclose (fpfclose (fp);); 运行结果:test.txt 的内容是3 4.5
13、0定义文件指针变量写入i, t 关闭文件共 28 页 第 1515 页11.4.2 fputc11.4.2 fputc函数和函数和fgetcfgetc函数函数 fputcfputc 功能:功能: 把一个字符写到把一个字符写到fpfp所指向的磁盘文件所指向的磁盘文件中。中。 格式:格式: fputc(ch , fpfputc(ch , fp););文件类型指针变量要输出的字符 fgetc 功能:功能:从指定磁盘文件读从指定磁盘文件读出出一个字符,该文件必须一个字符,该文件必须 是以读或读写的方式打开的。是以读或读写的方式打开的。 格式:格式:ch=fgetc(fp); 文件类型指针变量字符变量若
14、读到文件尾结束符时,函数返回一个文件结束标志EOF(值为-1)。可用feof(fp)处理文件是否结束,为1结束,否则为0。 若写成功,函数返回该字符,否则返回一个文件结束标志EOF(值为-1)。共 28 页 第 1616 页#include “stdio.h#include “stdio.h”main( )main( ) FILE FILE * *in, in, * *out;out;char ch,infile10,outfile10;char ch,infile10,outfile10;printf(“%Enter the infileprintf(“%Enter the infile n
15、ame:n”); name:n”);scanf(“%s”, infilescanf(“%s”, infile););printf(“Enter the outfileprintf(“Enter the outfile name: n); name: n);scanf(“%s”, outfilescanf(“%s”, outfile););共 28 页 第 1717 页if(in=fopen(infileif(in=fopen(infile, “r”)=NULL), “r”)=NULL) printf(“cannot open infilen printf(“cannot open infile
16、n”);”); exit(0); exit(0); if(out=fopen(outfile,”wif(out=fopen(outfile,”w”)=NULL)”)=NULL) printf(“cannot open infilen printf(“cannot open infilen”);”); exit(0); exit(0); while(!feof(in) fputc(fgetc(inwhile(!feof(in) fputc(fgetc(in), out);), out);fclose(infclose(in););fclose(outfclose(out);); 值为1数据读取结
17、束共 28 页 第 1818 页11.4.3 fread11.4.3 fread函数和函数和fwritefwrite函数函数 freadfread 功能:功能:从指定磁盘文件读入一组数据从指定磁盘文件读入一组数据。 格式:格式: fread(bufferfread(buffer, size, count, fp, size, count, fp););要读写的字节数指针,即读入数据的存放地址文件类型指针变量要进行读写多少个size字节的数据项例:例:fread(a,2,3,fp); a数组名,从数组名,从fp所指向的文件中读出所指向的文件中读出3次次数据,每次数据,每次2个个字节,字节,存入存
18、入a数组中。数组中。共 28 页 第 1919 页 fwrite 功能:功能:把一组数据写到指定磁盘文件上。把一组数据写到指定磁盘文件上。 格式:格式: fwrite(buffer,size,count, fp); 共 28 页 第 2020 页例如:假设学生的数据已存放在磁盘文件中,可用以例如:假设学生的数据已存放在磁盘文件中,可用以下下forfor语句和语句和freadfread函数读入函数读入4040个学生的数据。个学生的数据。for(i=0; i40; i+)for(i=0; i40; i+) fread(&studi, sizeof(struct fread(&studi, size
19、of(struct student_type), 1, fpstudent_type), 1, fp););可用以下的可用以下的forfor语句和语句和fwritefwrite函数将内存中函数将内存中4040个学生的个学生的数据输出到磁盘文件中去。数据输出到磁盘文件中去。for(i=0; i40; i+)for(i=0; i40; i+) fwrite(&studi,sizeof(struct fwrite(&studi,sizeof(struct student_type), student_type), 1,fp);1,fp);共 28 页 第 2121 页11.4.4 fgets11.4
20、.4 fgets函数和函数和fputsfputs函数函数 fgetsfgets 功能:功能: 从文件从文件读入一个指定的字符串到内存中读入一个指定的字符串到内存中。 例例: fgets(str,n,fp: fgets(str,n,fp);); 从从fpfp指向的文件读出一个具有指向的文件读出一个具有n-1n-1个字符的字符串个字符的字符串, ,存入其始地址为存入其始地址为strstr的内存中的内存中. . fputsfputs 功能:功能:将指定的字符串输出到将指定的字符串输出到fpfp所指向的文件中所指向的文件中. . fputs(str,fpfputs(str,fp););共 28 页 第
21、 2222 页 例例: 已有文本文件已有文本文件test.txt,内容为内容为Hello,everyone!,以下程序中文以下程序中文件件test.txt已正确为已正确为读读而打开而打开,由文件指针由文件指针fr指向该文件指向该文件,则程则程序输出结果为序输出结果为_. #include main() FILE *fr;char str40; fgets(str,5,fr); printf(%sn,str); fclose(fr); Hell从从frfr指向的文件读出一个具有指向的文件读出一个具有5-15-1个字符的字符串个字符的字符串, ,存入其始存入其始地址为地址为strstr的内存中的内
22、存中. .共 28 页 第 2323 页例:例:现有某校理学院现有某校理学院20072007级级8 8班的三十名学生的成绩数据班的三十名学生的成绩数据(包括学号,姓名,三门课成绩,平均成绩),存(包括学号,姓名,三门课成绩,平均成绩),存放在放在data08.txtdata08.txt文件中。编写程序从文件读入以文件中。编写程序从文件读入以上数据,计算出每名学生的平均成绩,再将成绩上数据,计算出每名学生的平均成绩,再将成绩数据存放在数据存放在data08_a.txtdata08_a.txt文件中。文件中。 共 28 页 第 2424 页#include stdio.h#include stdi
23、o.h structstruct student student long num; long num; char name8; char name8; int int score3; score3; float avr float avr; ; stu30; stu30;main()main()int i,j,sumint i,j,sum; ;FILE FILE * *fp1;fp1;/ /* *读文件读文件* */ /if(fp1=fopen(data08.dat, r)=NULL)if(fp1=fopen(data08.dat, r)=NULL) printf(Cannot printf
24、(Cannot open file!); return 0; open file!); return 0;for(ifor(i=0;i30;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);共 28 页 第 2525 页/ /* *计算计算* */ /for(ifor(i=0;i30;i+)
25、=0;i30;i+) sum=0; sum=0; for(j for(j=0;j3;j+)=0;j3;j+) sum+=stui.scorej sum+=stui.scorej; stui.avr stui.avr=sum/3.0;=sum/3.0; / /* *写文件写文件* */ / if(fp1=fopen(data08_a.txt, w)=NULL) if(fp1=fopen(data08_a.txt, w)=NULL) printf(Cannot open file!);return printf(Cannot open file!);return 0; 0; for(i for(i
26、=0;i30;i+)=0;i30;i+) fprintf(fp1, %ld %s %d %d %d fprintf(fp1, %ld %s %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); 共 28 页 第 2626 页检测文件指针函数:检测文件指针函数: feoffeof()()调用一般形式:调用一般形式: feof(fpfeof(fp););功能:检测文件指针是否到文件尾,若到文功能:检测文件指针是否到文件尾,若到文件尾,函数值为真(非件尾,函数值为真(非0 0),否则为假。),否则为假。exit(0):exit(0):系统标准函数,作用是关闭所有打系统标准函数,作用是关闭所有打开的文件,并终止程序的执行。开的文件,并终止程序的执行。参数参数0 0表示程序正常结束,非表示程序正常结束,非0 0参数通常表示参数通常表示不正常的程序结束。不正常的程序结束。