《C语言程序设计:第11章 文 件2》由会员分享,可在线阅读,更多相关《C语言程序设计:第11章 文 件2(30页珍藏版)》请在金锄头文库上搜索。
1、第十一章大连理工大学大连理工大学本本 章章 要要 点点掌握文件类型指针掌握文件类型指针 (FILE类型指针类型指针)掌握文件的打开与关闭掌握文件的打开与关闭 (fopen, fclose)掌握文件的读写掌握文件的读写11.1 C11.1 C文件概述文件概述1.1.定义:定义: 文件是指存储在外部介质上数据的集合。操作系统是以文件是指存储在外部介质上数据的集合。操作系统是以文件文件为单位对数据进行管理的。为单位对数据进行管理的。 每一个与主机相连的输入或输出设备都看作是一个文件。每一个与主机相连的输入或输出设备都看作是一个文件。2. 2. 组织形式:组织形式:按照文件的存储的编码形式分为两类按照
2、文件的存储的编码形式分为两类, ,文本(文本(ASCIIASCII码)文件码)文件:由若干行组成,每行有字符组成,:由若干行组成,每行有字符组成,以换行符做为行结束的标志以换行符做为行结束的标志 ( (文件的每一个字节放一个文件的每一个字节放一个ASCIIASCII代码,代表一个字符。代码,代表一个字符。) )二进制文件:二进制文件:把内存中的数据按其在内存中的存储形式把内存中的数据按其在内存中的存储形式原原样样输出到磁盘文件上。是字节的有序集合输出到磁盘文件上。是字节的有序集合. .3.3.逻辑逻辑结构:结构: 字符(字节)序列,即由一个个字符(字节)的数据字符(字节)序列,即由一个个字符(
3、字节)的数据顺序组成顺序组成, ,对文件的存取是以字符(字节)为单位的,这类对文件的存取是以字符(字节)为单位的,这类文件称为文件称为流式文件。流式文件。4. 输入和输出方式输入和输出方式缓冲文件系统:缓冲文件系统:系统自动在内存区为每一个正在使系统自动在内存区为每一个正在使用的文件名开辟一个缓冲区。用的文件名开辟一个缓冲区。内存内存缓充区外存文件输出输出输入输入共 29 页 第 5 5 页 C C程序对文件的所有操作通过对文件缓冲区的操程序对文件的所有操作通过对文件缓冲区的操作来完成。作来完成。对文件的读写操作通过库函数实现。对文件的读写操作通过库函数实现。程序要处理文件时,只需要跟内存缓冲
4、区打交道,程序要处理文件时,只需要跟内存缓冲区打交道,而不必考虑外部磁盘的特性。而不必考虑外部磁盘的特性。程序数据区输出文件缓冲区输入文件缓冲区磁盘操作系统自动完成程序控制共 29 页 第 6 6 页4. 输入输出方式输入输出方式缓冲文件系统:缓冲文件系统: 由于系统对从磁盘文件数据的存取速度与内存数据存取由于系统对从磁盘文件数据的存取速度与内存数据存取访问的速度不同,文件数据量较大,数据的读写不可能瞬间访问的速度不同,文件数据量较大,数据的读写不可能瞬间完成。为了提高数据存取速度,完成。为了提高数据存取速度,C程序对文件的处理采用缓冲程序对文件的处理采用缓冲文件系统方式进行。要求程序与文件之
5、间有一个内存缓冲区,文件系统方式进行。要求程序与文件之间有一个内存缓冲区,程序与文件的数据交换通过缓冲区进行。缓冲区的大小由程序与文件的数据交换通过缓冲区进行。缓冲区的大小由C系系统决定。统决定。 系统自动为每一个文件分配一个内存缓冲区,当程序要向系统自动为每一个文件分配一个内存缓冲区,当程序要向磁盘文件写入数据磁盘文件写入数据 ,必须先送到缓冲区,由操作系统把缓冲,必须先送到缓冲区,由操作系统把缓冲区的数据存入磁盘。从文件向内存读入数据,先由操作系统区的数据存入磁盘。从文件向内存读入数据,先由操作系统把数据读入缓冲区,然后程序将数据从缓冲区读入内存。把数据读入缓冲区,然后程序将数据从缓冲区读
6、入内存。 11.2 11.2 文件类型指针文件类型指针文件结构体类型:文件结构体类型: FILEFILE 每个被使用的文件都在内存中对应一个逻辑每个被使用的文件都在内存中对应一个逻辑设备(称为流),用来存放文件的有关信息设备(称为流),用来存放文件的有关信息(如文件名,状态,当前位置等)。这些信息(如文件名,状态,当前位置等)。这些信息保存在一个文件结构体类型的变量中。保存在一个文件结构体类型的变量中。结构体类型由系统定义为结构体类型由系统定义为“FILEFILE”。 有的有的C C版本在版本在 stdio.hstdio.h文件中有如下定义文件中有如下定义typedeftypedef stru
7、ctstruct intint _ _fdfd; ;; /* /* 文件号文件号 * */ / intint _cleft _cleft; /* /* 缓冲区中剩下的字符缓冲区中剩下的字符 * */ / intint _mode _mode; /* /* 文件操作模式文件操作模式 * */ / char *_ char *_nexttcnexttc; /* ; /* 下一个字符位置下一个字符位置 * */ / char *_buff; /* char *_buff; /* 文件缓冲区位置文件缓冲区位置 * */ / FILE;FILE;例:定义一个文件指针变量例:定义一个文件指针变量FILE
8、*FILE *fpfp; ;fpfp是一个指向是一个指向FILEFILE结构体的指针变量。可结构体的指针变量。可以使以使 fpfp指向某一个具体文件的结构体变指向某一个具体文件的结构体变量,通过读取该结构体变量中的有关信量,通过读取该结构体变量中的有关信息来实现对文件的访问和操作。息来实现对文件的访问和操作。也就是也就是通过通过fpfp 间接间接访问文件访问文件。程序逻辑设备外部文件fpfp共 29 页 第 1010 页文件的一般操作过程文件的一般操作过程 打开文件打开文件 建立用户程序与文件的联系建立用户程序与文件的联系. .只有文件被只有文件被成功打开成功打开, , 才能最文件进行读取操作
9、才能最文件进行读取操作. . 操作文件操作文件 对文件进行读操作对文件进行读操作: : 把文件内容读入内存把文件内容读入内存. . 对文件进行写、追加操作对文件进行写、追加操作: : 把内存中的数据写入外部文件中把内存中的数据写入外部文件中. . 关闭文件关闭文件 切断文件与程序的联系切断文件与程序的联系. .文件使用完文件使用完, ,必须必须关闭文件关闭文件. .11.3 11.3 文件的打开与关闭文件的打开与关闭11.3.111.3.1 文件的打开(函数文件的打开(函数 fopenfopen)功能:功能:在对文件读写之前打开文件。调用方式调用方式: FILE *FILE *fpfp; fp
10、fp= =fopenfopen( (文件名文件名, ,使用文件方式);使用文件方式);返回值:返回值:指向文件的指针,若失败返回 NULL 提示:提示:文件名和打开方式都是字符串,一般要指出文文件名和打开方式都是字符串,一般要指出文件存放的路径,不指出路径则默认与当前程序的路径件存放的路径,不指出路径则默认与当前程序的路径相同。相同。表示打开名为m1的文件,使用方式为“读入”.例:fpfp=fopen(=fopen(“m1m1”, ,”r r”);); fpfp= =fopen(fopen(“e:e:mydata.datmydata.dat”, ,”r r”);); 文件使用方式文件使用方式文
11、件使用方式文件使用方式下面含义中的输入输出是以计算机内存为主. 文件使用方式文件使用方式共 29 页 第 1414 页 进行文件读写的一般规则进行文件读写的一般规则读文件读文件 指定的文件必须存在,否则出错;指定的文件必须存在,否则出错;写文件(指定的文件可以存在,也可以不存在)写文件(指定的文件可以存在,也可以不存在) (1)(1)以以“w”w”方式写:方式写: ifif该文件已经存在该文件已经存在 原文件将被删去然后重新建立;原文件将被删去然后重新建立; elseelse 按指定的名字新建一个文件;按指定的名字新建一个文件; (2)(2)以以“a”a”方式写:方式写: ifif该文件已经存
12、在该文件已经存在 写入的数据附加在原数据后边;写入的数据附加在原数据后边; elseelse 按指定的名字新建一个文件(与按指定的名字新建一个文件(与“w”w”相同);相同); (3)(3)文件同时读和写:文件同时读和写: 使用使用“r+”r+”、“w+”w+”、“ “ a+”a+”打开文件。打开文件。11.3.2 11.3.2 11.3.2 11.3.2 文件的关闭(函数文件的关闭(函数文件的关闭(函数文件的关闭(函数 fclosefclosefclosefclose)功能:功能:使用文件之后关闭文件。使文件指针变量不再指向该文件。调用方式:调用方式: fclosefclose( (文件指针
13、);文件指针);返回值:返回值:关闭成功返回 0,若失败返回 非零值。例: fclosefclose (fpfp); ; 应该在程序结束之前关闭所有使用的文件,如果不关闭文件可能会丢失数据。用fclose关闭文件,将缓冲区的数据输出到磁盘后再释放文件指针变量,可避免数据丢失。11.4 11.4 11.4 11.4 文件的读写文件的读写文件的读写文件的读写11.4.1 11.4.1 格式化读写函数格式化读写函数 fscanffscanf 功能:功能:按按指定指定的输入的输入格式格式,把文件数据读入内存。,把文件数据读入内存。 fprintffprintf 功能:功能:将将内存信息按内存信息按指定
14、指定的输出的输出格式格式,输出到磁盘输出到磁盘文件上。文件上。格式格式:fprintffprintf (文件指针,格式字符串,输出表列)文件指针,格式字符串,输出表列)fscanffscanf (文件指针,格式字符串,输入表列)文件指针,格式字符串,输入表列)11.4 11.4 11.4 11.4 文件的读写文件的读写文件的读写文件的读写例:例:fscanf(fp,”%d%f”,&i,&afscanf(fp,”%d%f”,&i,&a);); 从从fpfp所指向的文件中,取出数据赋给所指向的文件中,取出数据赋给i i和和a.a. fprintf(fp,”%dfprintf(fp,”%d, %,
15、%f”,a,bf”,a,b);); 将将a a和和b b的值按指定格式写入到的值按指定格式写入到fpfp所指向的文件中。所指向的文件中。 例例: : 将两变量的数值写入将两变量的数值写入test.txt test.txt 。#include “#include “stdio.hstdio.h”main( )main( ) FILE * FILE *fpfp; ; intint i=3; float t=4.5; i=3; float t=4.5; if(if(fpfp= =fopen(“f:aatest.txtfopen(“f:aatest.txt”, “w”)”, “w”) = NULL)
16、= NULL) printfprintf (“file open failed”); (“file open failed”); exit(0); exit(0); fprintffprintf( ( fp,“%dfp,“%d, %6.2f”,i, t );, %6.2f”,i, t );fclosefclose ( (fpfp);); 运行结果:test.txt 的内容是3,4.50“f:aatest.txtf:aatest.txt” 就是就是f:aatest.txtf:aatest.txt11.4.2 11.4.2 fputcfputc函数和函数和fgetcfgetc函数函数fputcfp
17、utc 功能功能: :把一个内存字符写到fp所指向的磁盘文件中。 格式:格式: fputc(chfputc(ch , , fpfp);); fgetc 功能:功能:从指定磁盘文件读出一个字符到内存,该文件必须是以读或读写的方式打开的。 格式:格式:ch=fgetc(fp); 若读到文件尾结束符时,函数返回一个文件结束标志EOF(值为-1)。例:将一个磁盘文件中的信息复制到另一个磁盘文件中。例:将一个磁盘文件中的信息复制到另一个磁盘文件中。#include “#include “stdio.hstdio.h”main( )main( ) FILE *in, *out; FILE *in, *ou
18、t;char ch,infile10,outfile10;char ch,infile10,outfile10;printf(“%Enterprintf(“%Enter the the infileinfile name:n”); name:n”);scanf(“%sscanf(“%s”, ”, infileinfile););printf(“Enterprintf(“Enter the the outfileoutfile name: n); name: n);scanf(“%sscanf(“%s”, ”, outfileoutfile););if(inif(in= =fopen(infil
19、efopen(infile, “r”)= =NULL), “r”)= =NULL) printf(“cannotprintf(“cannot open open infileninfilen”);”); exit(0); exit(0); if(out=if(out=fopen(outfile,”wfopen(outfile,”w”)= =NULL)”)= =NULL) printf(“cannotprintf(“cannot open open infileninfilen”);”); exit(0); exit(0); while(!feof(inwhile(!feof(in) ) fpu
20、tc(fgetc(infputc(fgetc(in), out);), out);fclose(infclose(in););fclose(outfclose(out);); 可用feof(fpfeof(fp) )处理文件是否结束.其返回值非零表示结束,0表示未结束。11.4.4 11.4.4 fgetsfgets函数和函数和fputsfputs函数函数fgetsfgets 功能:功能: 从文件读入一个指定的字符串到内存中。 例: fgets(str,n,fp); 从fp指向的文件读出一个具有n-1个字符的字符串,存入其始地址为str的内存中.fputsfputs 功能:功能:将指定的字符串输
21、出到fp所指向的文件中. fputs(str,fpfputs(str,fp);); 例例: 已已有有文文本本文文件件test.txt,内内容容为为Hello,everyone!,以以下下程程序序中中文文件件test.txt为为读读而而打打开开,由由文文件件指指针针fr指指向向该该文文件件,则则程程序序输输出出结结果为果为_. #include main() FILE *fr;char str40; fgets(str,5,fr); printf(%sn,str); fclose(fr); Hell11.4.3 11.4.3 freadfread函数和函数和fwritefwrite函数函数fre
22、adfread 功能:功能:从指定磁盘文件读入一组数据到内存。 格式:格式: fread(bufferfread(buffer, size, count, , size, count, fpfp););要读写的字节数读入数据的内存存放地址要进行读写多少个size字节的数据项例:例:fread(a,2,3,fp); a数组名,从数组名,从fp所指向的文件中读出所指向的文件中读出3次数据,每次次数据,每次2个字节,存入个字节,存入a数组中。数组中。例如:假设学生的数据已存放在磁盘文件中,可用以下forfor语句和freadfread函数读入40个学生的数据。structstruct student
23、 student long long intint num; num; char name10; char name10; char sex; char sex;stud40;stud40;for(i=0; i40; i+)for(i=0; i40; i+) fread(&studifread(&studi, , sizeof(structsizeof(struct student), 1, student), 1, fpfp);); fwrite 功能:功能:,把一组数据写到指定磁盘文件上。 格式:格式: fwrite(buffer,size,count, fp); 可用以下的forfor语
24、句和fwritefwrite函数将内存中40个学生的数据输出到磁盘文件中去。for(ifor(i=0; i40; i+)=0; i40; i+) fwrite(&studifwrite(&studi, , sizeof(structsizeof(struct student), 1, student), 1, fpfp););共 29 页 第 2727 页文件编程综合示例:文件编程综合示例:现有某学院现有某学院20092009级级8 8班的三十名学生的成绩数据班的三十名学生的成绩数据(包括学号,姓名,三门课成绩,平均成绩),存(包括学号,姓名,三门课成绩,平均成绩),存放在放在data08.t
25、xtdata08.txt文件中。编写程序从文件读入以文件中。编写程序从文件读入以上数据,计算出每名学生的平均成绩,再将成绩上数据,计算出每名学生的平均成绩,再将成绩数据存放在数据存放在data08_a.txtdata08_a.txt文件中。文件中。 共 29 页 第 2828 页#include #include stdio.hstdio.h structstruct student student long num; long num; char name8; char name8; intint score3; score3; float float avravr; ; stu30; st
26、u30;main()main() intint i,j,sumi,j,sum; ; FILE *fp1; FILE *fp1;if(fp1=fopen(“data08.txt, r)=NULL)if(fp1=fopen(“data08.txt, r)=NULL) printf(Cannotprintf(Cannot open file!); exit(0); open file!); exit(0);for(ifor(i=0;i30;i+)=0;i30;i+)fscanf(fp1,%ld%s%d%d%d,&stui.num,stui.name,fscanf(fp1,%ld%s%d%d%d,&s
27、tui.num,stui.name, &stui.score0,&stui.score1,&stui.score2); &stui.score0,&stui.score1,&stui.score2);共 29 页 第 2929 页/*/*计算计算* */ /for(ifor(i=0;i30;i+)=0;i30;i+) sum=0; sum=0; for(jfor(j=0;j3;j+)=0;j3;j+) sum+= sum+=stui.scorejstui.scorej; stui.avrstui.avr=sum/3.0;=sum/3.0; /*/*写文件写文件* */ / if(fp1=fop
28、en(data08_a.txt, w)=NULL) if(fp1=fopen(data08_a.txt, w)=NULL) printf(Cannotprintf(Cannot open file!);exit(0); open file!);exit(0); for(ifor(i=0;i30;i+)=0;i30;i+) fprintf(fp1,%ld %s %d fprintf(fp1,%ld %s %d %d%d %d%d % %fnfn, stui.num,stui.name,stui.score0, stui.num,stui.name,stui.score0, stui.score1
29、,stui.score2,stui.avr); stui.score1,stui.score2,stui.avr); fclose(fp1); fclose(fp1); 共 29 页 第 3030 页检测文件指针函数:检测文件指针函数: feoffeof()()调用一般形式:调用一般形式: feof(fpfeof(fp););功能:检测文件指针是否到文件尾,若到文件尾,功能:检测文件指针是否到文件尾,若到文件尾,函数值为非函数值为非0 0,否则为,否则为0 0。exit(0):exit(0):系统标准函数,作用是关闭所有打开的文系统标准函数,作用是关闭所有打开的文件,并终止程序的执行。件,并终止程序的执行。参数参数0 0表示程序正常结束,非表示程序正常结束,非0 0参数通常表示不正常参数通常表示不正常的程序结束。的程序结束。