C语言程序设计教学课件:第11章 文件

上传人:ni****g 文档编号:570173491 上传时间:2024-08-02 格式:PPT 页数:29 大小:460KB
返回 下载 相关 举报
C语言程序设计教学课件:第11章 文件_第1页
第1页 / 共29页
C语言程序设计教学课件:第11章 文件_第2页
第2页 / 共29页
C语言程序设计教学课件:第11章 文件_第3页
第3页 / 共29页
C语言程序设计教学课件:第11章 文件_第4页
第4页 / 共29页
C语言程序设计教学课件:第11章 文件_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《C语言程序设计教学课件:第11章 文件》由会员分享,可在线阅读,更多相关《C语言程序设计教学课件:第11章 文件(29页珍藏版)》请在金锄头文库上搜索。

1、共 29 页 第 1 1 页第十一章C C语言程序设计语言程序设计共 29 页 第 2 2 页本本 章章 要要 点点掌握文件类型指针掌握文件类型指针 (FILE类型指针类型指针)掌握文件的打开与关闭掌握文件的打开与关闭 (fopen, fclose)掌握文件的读写掌握文件的读写共 29 页 第 3 3 页11.1 C11.1 C文件概述文件概述1.1.定义:定义: 文件是指存储在外部介质上数据的集合。操作系文件是指存储在外部介质上数据的集合。操作系统是以统是以文件文件为单位对数据进行管理的。每一个与主机为单位对数据进行管理的。每一个与主机相连的输入或输出设备都看作是一个文件。相连的输入或输出设

2、备都看作是一个文件。2.2.组织形式:组织形式: 按照文件的存储的编码形式分为两类按照文件的存储的编码形式分为两类ASCIIASCII码(文本)文件码(文本)文件:文件的每一个字节放一个:文件的每一个字节放一个ASCIIASCII代码,代表一个字符。代码,代表一个字符。二进制文件:二进制文件:把内存中的数据按其在内存中的存储形把内存中的数据按其在内存中的存储形式原样输出到磁盘文件上。式原样输出到磁盘文件上。3. 3. 逻辑结构:逻辑结构: 从文件的逻辑结构把文件看做数据流从文件的逻辑结构把文件看做数据流字符(字节)序列:由一个个字符(字节)的数据顺字符(字节)序列:由一个个字符(字节)的数据顺

3、序组成序组成, ,对文件的存取是以字符(字节)为单位,称为对文件的存取是以字符(字节)为单位,称为字符流字符流。二进制流二进制流共 29 页 第 4 4 页4. 输入输出方式输入输出方式缓冲文件系统:缓冲文件系统: 由于系统对从磁盘文件数据的存取速度与内存数由于系统对从磁盘文件数据的存取速度与内存数据存取访问的速度不同,文件数据量较大,数据的读据存取访问的速度不同,文件数据量较大,数据的读写不可能瞬间完成。为了提高数据存取速度,写不可能瞬间完成。为了提高数据存取速度,C程序程序对文件的处理采用缓冲文件系统方式进行。要求程序对文件的处理采用缓冲文件系统方式进行。要求程序与文件之间有一个内存缓冲区

4、,程序与文件的数据交与文件之间有一个内存缓冲区,程序与文件的数据交换通过缓冲区进行。缓冲区的大小由换通过缓冲区进行。缓冲区的大小由C系统决定。系统决定。 系统自动为每一个文件分配一个内存缓冲区,当系统自动为每一个文件分配一个内存缓冲区,当程序要向磁盘文件写入数据程序要向磁盘文件写入数据 ,必须先送到缓冲区,必须先送到缓冲区,由操作系统把缓冲区的数据存入磁盘。从文件向内存由操作系统把缓冲区的数据存入磁盘。从文件向内存读入数据,先由操作系统把数据读入缓冲区,然后程读入数据,先由操作系统把数据读入缓冲区,然后程序将数据从缓冲区读入内存。序将数据从缓冲区读入内存。 共 29 页 第 5 5 页非缓冲文

5、件系统:非缓冲文件系统: 系统不自动开辟确定大小的缓冲区,而由程序为系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。每个文件设定缓冲区。 不同的操作系统对文件的处理采用不同的方式,不同的操作系统对文件的处理采用不同的方式,UNIXUNIX用缓冲文件系统处理文本文件,用非缓冲系统用缓冲文件系统处理文本文件,用非缓冲系统处理二进制文件。标准处理二进制文件。标准C C只采用缓冲文件系统。只采用缓冲文件系统。共 29 页 第 6 6 页 C C程序对文件的所有操作通过对文件缓冲区的操程序对文件的所有操作通过对文件缓冲区的操作来完成。作来完成。对文件的读写操作通过库函数实现。对文件的读写操

6、作通过库函数实现。程序要处理文件时,只需要跟内存缓冲区打交道,程序要处理文件时,只需要跟内存缓冲区打交道,而不必考虑外部磁盘的特性。而不必考虑外部磁盘的特性。程序数据区输出文件缓冲区输入文件缓冲区磁盘操作系统自动完成程序控制共 29 页 第 7 7 页11.2 11.2 文件类型指针文件类型指针结构体类型结构体类型 FILEFILE 每个被使用的文件都在内存中开辟一个区域,每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息(如文件名,状态,当用来存放文件的有关信息(如文件名,状态,当前位置等)。这些信息保存在一个结构体类型的前位置等)。这些信息保存在一个结构体类型的变量中。变量中。

7、定义:定义:缓冲文件系统中,获取内存中存放文件有缓冲文件系统中,获取内存中存放文件有关信息的结构体的指针定义为文件类型指针。通关信息的结构体的指针定义为文件类型指针。通过文件指针变量能找到指定的文件,以实现对文过文件指针变量能找到指定的文件,以实现对文件的访问。件的访问。共 29 页 第 8 8 页对文件操作的相关信息的结构体类型由系统定义为对文件操作的相关信息的结构体类型由系统定义为“FILEFILE”,包含在包含在 stdio.hstdio.h文件中:如文件中:如typedef structtypedef struct int _fd; int _fd;; /* /* 文件号文件号 * *

8、/ / int _cleft int _cleft; /* /* 缓冲区中剩下的字符缓冲区中剩下的字符 * */ / int _mode int _mode; /* /* 文件操作模式文件操作模式 * */ / char *_nexttc; /* char *_nexttc; /* 下一个字符位置下一个字符位置 * */ / char *_buff; /* char *_buff; /* 文件缓冲区位置文件缓冲区位置 * */ / FILE;FILE;共 29 页 第 9 9 页例:定义一个文件指针变量例:定义一个文件指针变量FILE *fp;FILE *fp;fpfp是一个指向是一个指向FI

9、LEFILE结构体类型的指针变量。结构体类型的指针变量。可以使可以使 fpfp指向某一个具体文件的结构体变指向某一个具体文件的结构体变量,通过读取该结构体变量中的有关信息量,通过读取该结构体变量中的有关信息来实现对文件的访问和操作。来实现对文件的访问和操作。也就是通过也就是通过fp fp 指定要被访问的文件指定要被访问的文件。提示:提示:文件操作具有顺序性,文件指针不能进行文件操作具有顺序性,文件指针不能进行fp+fp+或或fpfp操作,前一个数据取出后,下一次将顺序取后操作,前一个数据取出后,下一次将顺序取后一个数据。一个数据。共 29 页 第 1010 页文件的一般操作过程文件的一般操作过

10、程 打开文件打开文件 建立用户程序与文件的联系建立用户程序与文件的联系 操作文件操作文件 对文件进行读、写、追加等操作对文件进行读、写、追加等操作 关闭文件关闭文件 切断文件与程序的联系切断文件与程序的联系共 29 页 第 1111 页11.3 11.3 文件的打开与关闭文件的打开与关闭11.3.111.3.1 文件的打开(函数文件的打开(函数 fopenfopen)功能:在对文件读写之前打开文件。功能:在对文件读写之前打开文件。调用方式调用方式: FILE *fpFILE *fp; fp=fopen(fp=fopen(文件名文件名, ,使用文件方式);使用文件方式);返回值:指定文件的指针,

11、若失败返回返回值:指定文件的指针,若失败返回 NULLNULL三要素:三要素:文件指针,文件名,使用方式文件指针,文件名,使用方式例:fp=fopen(“m1”,”r”);fp=fopen(“m1”,”r”); fp=fopen(“e:mydata.dat”,”r”);fp=fopen(“e:mydata.dat”,”r”);表示打开名为m1的文件,使用方式为“读入”.提示:提示:文件名和打开方式都是字符串,一般要指出文文件名和打开方式都是字符串,一般要指出文件存放的路径,不指出路径则默认与当前程序的路径件存放的路径,不指出路径则默认与当前程序的路径相同。相同。共 29 页 第 1212 页

12、文件使用方式文件使用方式文件使用方式文件使用方式共 29 页 第 1313 页 文件使用方式文件使用方式共 29 页 第 1414 页 进行文件读写的一般规则进行文件读写的一般规则1. 1. 读文件读文件 指定的文件必须存在,否则出错;指定的文件必须存在,否则出错;2. 2. 写文件(指定的文件可以存在,也可以不存在)写文件(指定的文件可以存在,也可以不存在) (1)(1)以以“w”w”方式写:方式写: ifif该文件已经存在该文件已经存在 原文件将被删去然后重新建立;原文件将被删去然后重新建立; elseelse 按指定的名字新建一个文件;按指定的名字新建一个文件; (2)(2)以以“a”a

13、”方式写:方式写: ifif该文件已经存在该文件已经存在 写入的数据附加在原数据后边;写入的数据附加在原数据后边; elseelse 按指定的名字新建一个文件(与按指定的名字新建一个文件(与“w”w”相同);相同); (3)(3)文件同时读和写:文件同时读和写: 使用使用“r+”r+”、“w+”w+”、“ “ a+”a+”打开文件。打开文件。共 29 页 第 1515 页11.3.2 11.3.2 11.3.2 11.3.2 文件的关闭(函数文件的关闭(函数文件的关闭(函数文件的关闭(函数 fclosefclosefclosefclose)功能:使用文件之后关闭文件。使文件指针变量功能:使用文

14、件之后关闭文件。使文件指针变量不再指向该文件。不再指向该文件。调用方式:调用方式: fclose(fclose(文件指针);文件指针);返回值:关闭成功返回返回值:关闭成功返回 0 0,若失败返回,若失败返回 非零值非零值。例:例: fclose fclose (fpfp); ; 在程序结束之前关闭所有使用的文件,如果不在程序结束之前关闭所有使用的文件,如果不关闭文件可能会丢失数据。用关闭文件可能会丢失数据。用fclosefclose关闭文件,关闭文件,将缓冲区的数据输出到磁盘后再释放文件指针变将缓冲区的数据输出到磁盘后再释放文件指针变量,可避免数据丢失。量,可避免数据丢失。共 29 页 第

15、1616 页11.4 11.4 文件的读写文件的读写11.4.1 11.4.1 格式化读写函数格式化读写函数 fscanf fscanf 功能:功能:将指定磁盘文件格式化赋给指定对象将指定磁盘文件格式化赋给指定对象。 fprintf fprintf 功能:将指定对象格式化输出到指定磁盘文件上。功能:将指定对象格式化输出到指定磁盘文件上。格式格式: fprintf fprintf (文件指针,格式字符串,输出表列)文件指针,格式字符串,输出表列) fscanf fscanf (文件指针,格式字符串,输入表列)文件指针,格式字符串,输入表列)例:例:fscanf(fp,”%d,%f”,&i,&a)

16、;fscanf(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所指向的文件中。所指向的文件中。共 29 页 第 1717 页例例1: 1: 将两个变量的数值写入将两个变量的数值写入test.txttest.txt 。# include “stdio.h”# include “stdio.h”main( )main( )FILE *fpFILE *fp

17、;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.txt 的内容是3,4

18、.50定义文件指针变量写入i, t 关闭文件共 29 页 第 1818 页11.4.2 fputc11.4.2 fputc函数和函数和fgetcfgetc函数函数fputc fputc 功能:功能: 把一个字符写到把一个字符写到fpfp所所指向的磁盘文件指向的磁盘文件中。中。 格式:格式: fputc(ch , fp);fputc(ch , fp);文件类型指针变量要输出的字符 fgetc 功能:功能:从指定磁盘文件读从指定磁盘文件读出出一个字符,该文件必须一个字符,该文件必须 是以读或读写的方式打开的。是以读或读写的方式打开的。 格式:格式:ch=fgetc(fp); 文件类型指针变量字符变

19、量若读到文件尾结束符时,函数返回一个文件结束标志EOF(值为-1)。可用feof(fp)处理文件是否结束,为1结束,否则为0。 若写成功,函数返回该字符,否则返回一个文件结束标志EOF(值为-1)。共 29 页 第 1919 页11.4.3 fread11.4.3 fread函数和函数和fwritefwrite函数函数fread fread 功能:功能:从指定磁盘文件读入一组数据从指定磁盘文件读入一组数据。 格式:格式: fread(buffer, size, count, fp);fread(buffer, size, count, fp);要读写的字节数指针,即读入数据的存放地址文件类型指

20、针变量要进行读写多少个size字节的数据项例:例:int a3, FILE *fp= fopen (.); fread(a,4,3,fp); a数组名,从数组名,从fp所指向的文件中读出所指向的文件中读出3次次数据,每次数据,每次4个个字节,字节,存入存入a数组中。数组中。共 29 页 第 2020 页 fwrite 功能:功能:把一组数据写到指定磁盘文件上。把一组数据写到指定磁盘文件上。 格式:格式: fwrite(buffer,size,count, fp);fread()、fwrite()用于读写数据块(指定字节数量,用于读写数据块(指定字节数量,如一个数组元素、一个结构变量的值等。多用

21、于读写如一个数组元素、一个结构变量的值等。多用于读写二进制文件。二进制文件。 例:例:int a3; FILE *fp= fopen (.); fwrite(a,4,3,fp); a数组名,从数组名,从a数组中中读出数组中中读出3次次数据,每次数据,每次4个个字节,存入字节,存入fp所指向的文件。所指向的文件。共 29 页 第 2121 页例如:假设学生的数据已存放在磁盘文件中,可用以例如:假设学生的数据已存放在磁盘文件中,可用以下下forfor语句和语句和freadfread函数读入函数读入4040个学生的数据。个学生的数据。for(i=0; i40; i+)for(i=0; i40; i+

22、) fread(&studi, sizeof(struct student_type), fread(&studi, sizeof(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_ty

23、pe), 1,fp);1,fp);共 29 页 第 2222 页11.4.4 fgets11.4.4 fgets函数和函数和fputsfputs函数函数fgets fgets 功能:功能: 从文件从文件读入一个指定的字符串到内存中读入一个指定的字符串到内存中。 例例: fgets(str,n,fp);: fgets(str,n,fp); 从从fpfp指向的文件读出一个具有指向的文件读出一个具有n-1n-1个字符的字符串个字符的字符串, ,存入其始地址为存入其始地址为strstr的内存中的内存中. .fputs fputs 功能:功能:将指定的字符串输出到将指定的字符串输出到fpfp所指向的文件

24、中所指向的文件中. . fputs(str,fp);fputs(str,fp);共 29 页 第 2323 页检测文件指针函数:检测文件指针函数: feof()feof()调用一般形式:调用一般形式: feof(fp);feof(fp);功能:检测文件指针是否到文件尾,若到文件尾,函数值为真功能:检测文件指针是否到文件尾,若到文件尾,函数值为真(非(非0 0),否则为假。),否则为假。exit(0):exit(0):系统标准函数,作用是关闭所有打开的文件,并终止程系统标准函数,作用是关闭所有打开的文件,并终止程序的执行。序的执行。参数参数0 0表示程序正常结束,非表示程序正常结束,非0 0参数

25、通常表示不正常的程序结束。参数通常表示不正常的程序结束。共 29 页 第 2424 页例例2 2:将一个磁盘文件中的信息复制到另一个磁盘文件中。:将一个磁盘文件中的信息复制到另一个磁盘文件中。#include “stdio.h”#include “stdio.h”main( )main( ) FILE *in, *out; FILE *in, *out;char ch,infile10,outfile10;char ch,infile10,outfile10;printf(“%Enter the infile name:n”);printf(“%Enter the infile name:n”

26、);scanf(“%s”, infile);scanf(“%s”, infile);printf(“Enter the outfile name: n);printf(“Enter the outfile name: n);scanf(“%s”, outfile);scanf(“%s”, outfile);共 29 页 第 2525 页if(in=fopen(infile, “r”)=NULL)if(in=fopen(infile, “r”)=NULL) printf(“cannot open infilen”); printf(“cannot open infilen”); exit(0);

27、 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) while(!feof(in) fputc(fgetc(in), out); fputc(fgetc(in), out);fclose(in);fclose(in);fclose(out);fclose(out); 值为1数据读取结束在在whilewhile循环

28、中,只要!循环中,只要!feof(in)feof(in)为真,说明为真,说明inin还没有指到文件尾还没有指到文件尾共 29 页 第 2626 页 例例3:已已有有文文本本文文件件test.txt,内内容容为为Hello,everyone!,以以下下程程序序中中文文件件test.txt已已正正确确为为读读而而打打开开,由由文文件件指指针针fr指指向向该该文文件件,则程序输出结果为则程序输出结果为_.#include main() FILE *fr;char str40; fgets(str,5,fr); printf(%sn,str); fclose(fr); Hell从从frfr指向的文件读

29、出一个具有指向的文件读出一个具有5-15-1个字符的字符串个字符的字符串, ,存入起始存入起始地址为地址为strstr的内存中的内存中. .共 29 页 第 2727 页文件编程综合示例:文件编程综合示例: 现有某学院现有某学院20092009级级8 8班的三十名学生的成绩数据班的三十名学生的成绩数据(包括学号,姓名,三门课成绩,平均成绩),(包括学号,姓名,三门课成绩,平均成绩), 存放在存放在data08.txtdata08.txt文件中。编写程序从文件文件中。编写程序从文件读入以上数据,计算出每名学生的平均成绩,再读入以上数据,计算出每名学生的平均成绩,再将成绩数据存放在将成绩数据存放在

30、data08_a.txtdata08_a.txt文件中。文件中。 共 29 页 第 2828 页#include stdio.h#include stdio.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(“da

31、ta08.txt, r)=NULL)if(fp1=fopen(“data08.txt, r)=NULL) printf(Cannot open file!); return 0; printf(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

32、.score1,&stui.score2);共 29 页 第 2929 页/*/*计算计算* */ /for(i=0;i30;i+)for(i=0;i30;i+) sum=0; sum=0; for(j=0;j3;j+) for(j=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

33、 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 %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);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号