樊媛媛《c语言程序设计》.ppt

上传人:牧羊曲112 文档编号:5992283 上传时间:2023-09-12 格式:PPT 页数:42 大小:298.61KB
返回 下载 相关 举报
樊媛媛《c语言程序设计》.ppt_第1页
第1页 / 共42页
樊媛媛《c语言程序设计》.ppt_第2页
第2页 / 共42页
樊媛媛《c语言程序设计》.ppt_第3页
第3页 / 共42页
樊媛媛《c语言程序设计》.ppt_第4页
第4页 / 共42页
樊媛媛《c语言程序设计》.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《樊媛媛《c语言程序设计》.ppt》由会员分享,可在线阅读,更多相关《樊媛媛《c语言程序设计》.ppt(42页珍藏版)》请在三一办公上搜索。

1、第十三章 文件3.1 文件概述 文件概念 所谓文件就是:存储在外部介质上 的信息集合。根据存储的介质不同可分为:磁盘文件、磁带文件等。根据内容的不同可分为:程序文件、数据文件等。,使用文件输入输出的必要性 这里主要讨论数据文件的输入输出,即如何将文件中的数据“输入”到程序的数据结构中,如何将程序的数据结构中的数据“输出”到文件中。以往的输入输出方法:键盘输入,屏幕输出。这种方法不适用于数据量大的情况。举例说明:,main()int i,a1000;for(i=0;i1000;i+)scanf(“%d”,a+i);for(i=0;i1000;i+)printf(“%5d”,ai);,缺 点:可能

2、出现重复输入。输出的数据不能保存,不能进一步使 用。,采用文件输入输出可以克服这些缺点。main()int i,a1000;for(i=0;i1000;i+)scanf(“%d”,a+i);for(i=0;i1000;i+)printf(“%5d”,ai);,文件,文件,C文件分类 按在磁盘上存储的形式不同,可分为:文本文件:以ASCII字符存放可见、可编辑、占空间大。二进制文件:以二进制形式存放不可见、不可编辑、占空间小。使用时可根据需要选择。,13.2 文件类型指针 每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件名、文件状态及文件当前位置等)。这些信息保存在一个FIL

3、E类型的结构体变量中。若 FILE*fp;则fp就称为指向文件类型的指针变量。访问文件通过文件指针进行。,FILE结构体类型是由系统定义的。具体定义如下:见P331-332 typedef struct short level;缓冲区“满”或“空”的程度 unsigned flags;文件状态标志 char fd;文件描述符 unsigned char hold;如无缓冲区不读取字符 short bsize;缓冲区的大小 unsigned char*buffer;缓冲区的位置 unsigned char*curp;当前读写指针 unsigned istemp;临时文件,指示器 short to

4、ken;用于有效性检验 FILE;,13.3 文件的打开与关闭 对文件的读写之前应“打开”该文件。使用结束后“关闭”此文件。文件的打开(fopen 函数)用fopen函数实现对文件的打开。fopen函数调用的一般形式:FILE*fp;fp=fopen(文件名,读写方式);,例如:fp=fopen(“a1”,”r”);以只读方式打开文件a1。fopen函数返回指向a1文件的指针,即fp是指向a1文件的指针变量,往后就可以通过fp访问a1文件。,文件读写方式:见P333-334“r”按只读方式打开一个文本文件“w”按只写方式打开一个文本文件“a”按追加方式打开一个文本文件“rb”按只读方式打开一个

5、二进制文件“wb”按只写方式打开一个二进制文件“ab”按追加方式打开一个二进制文件,“r+”按读写方式打开一个文本文件“w+”按读写方式建立一个新的文本文件“a+”按读写方式打开一个文本文件“rb+”按读写方式打开一个二进制文件“wb+”按读写方式建立一个新的二进制文“ab+”按读写方式打开一个二进制文件,说明:(1)不能用”r”方式打开一个不存在的文 件,”r”方式只读不能写。(2)“w”方式只写不能读,具有建立和 覆盖功能。(3)调用fopen函数时,如果返回NULL则 表示打开不成功。,文件的关闭(fclose 函数)在使用完一个文件后应用fclose 函数关 闭文件,形式为:fclos

6、e(文件指针);如:fclose(fp);关闭后fp不再指向该文件。,13.4 文件的读写 文件打开后,就可以对它进行读写了。文本文件的读写 即如何将以文本方式存放的文件输入到程序的数据结构中。如何将程序的数据结构中的数据以文本方式输出到文件中。读对象:以文本方式存放的文件 写对象:以文本方式存放的文件,用于对文本文件读写的函数有:见P374-377,输入输出函数 fscanf fprintf fgetc,getc fputc,putc fgets fputs 重点介绍 fscanf 和 fprintf。,以例子说明fscanf和fprintf的使用。例:已知文本文件f1.dat中存放有100

7、个学生的分数,要求读入这些数据,并按从高到低的顺序排序后输出到另一文件中。,#include“stdio.h”#include“stdlib.h”void sort(int*a,int n)main()int i,a100;FILE*fp;fp=fopen(“f1.dat”,“r”);if(fp=NULL)exit(0);,定义一个指向文件的指针变量,打开文件,使fp指向文件f1.dat,E:fyyc-code13f1.dat,for(i=0;i100;i+)fscanf(fp,”%d”,a+i);fclose(fp);sort(a,100);fp=fopen(“f1-1.dat”,“w”);

8、for(i=0;i100;i+)fprintf(fp,”%4d”,ai);fclose(fp);T13-1.c,从fp所指的文件中读数据,关闭fp所指的文件,注意:文本文件的输入格式要与 文件中的数据格式匹配。,二进制文件的读写 即如何将以二进制方式存放的文件输入到程序的数据结构中。如何将程序的数据结构中的数据以二进制方式输出到文件中。读对象:以二进制方式存放存放的文件写对象:以二进制方式保存放的文件 读写函数:fread fwrite getw putw,例:将前例中的排序结果改用二进制方式输出到文件f3.dat中。(T13-1-2.c)#include“stdio.h”#include“s

9、tdlib.h”void sort(int*a,int n)main()int i,a100;FILE*fp;fp=f open(“f1.dat”,“r”);if(fp=NULL)exit(0);,for(i=0;i100;i+)fscanf(fp,”%d”,a+i);fclose1(fp);sort(a,100);fp=fopen(“f1-2.dat”,“wb”);fwrite(a,sizeof(int),100,fp);fclose(fp);,数据的开始地址,数据的每一项的长度,数据的项数,文件的指针,如果要将二进制文件f3.dat读到数组中,则有:(T13-1-3.c),#include

10、“stdio.h”main()int a100;FILE*fp;fp=fopen(“f1-2.dat”,“rb”);if(fp=NULL)exit(0);fread(a,sizeof(int),100,fp);fclose(fp);,13.5 文件的定位 文件中有一个位置指针,指向当前读写位置。如果顺序读写一个文件,每次读写完一个字符后,该位置指针自动指向下一个字符位置。如果想改变这样的规律,强制使位置指针指向指定位置,可以用有关函数。,rewind函数 rewind函数的作用是使位置指针重返回文件的开头。例:对文本文件f1.dat中的100个分数求超过平均分的人数。T13-2.c,#incl

11、ude“stdio.h”main()int i,a,n=0;float aver=0;FILE*fp;fp=fopen(“f1.dat”,“r”);for(i=0;i100;i+)fscanf(fp,”%d”,aver/=100;rewind(fp);for(i=0;iaver)n+;fclose(fp);printf(“n%d”,n);,fseek函数和随机读写 使用fseek函数可以将位置指针指向所需的位置。fseek函数调用的一般形式:fseek(文件指针,位移量,参考点);,以参考点为基准,向前移动的字节数,0 或 SEEK_SET 文件开始1 或 SEEK_CUR 当前位置2 或 S

12、EEK_END 文件末尾,例:如果fp是指向一个存放100个整数的二进制文件,要读取第50个数到变量n时(T13-2-2.c)fseek(fp,sizeof(int)*(50-1),SEEK_SET);fread(,例:如果fp是指向一个存放100个整数的文本文件,并已知每个数按3位数字的定长格式存放,要读取第50个数到变量n时:(T13-2-3.c)fseek(fp,3*(50-1),SEEK_SET);fscanf(fp,”%3d”,例:已知文本文件f2.dat中存放有100个学生的学号、姓名和考试成绩;要求从键盘输入任一学号,检索出相应学生的数据。说明:(1)文件f2.dat中每行为一个

13、学生的数据,按定长格式存放,依次为:学号(整数,占5格)、姓名(占10格)、成绩(整数,占4格)。(2)按学号从小到大的顺序连号存放,起始学号为1001。,#include“stdio.h”typedef struct int num;char name20;int score;STU;main()int no;STU st;FILE*fp;,fp=fopen(“f2.dat”,”r”);scanf(“%d”,T13-3-1.c,1001 aaa 11 1002 bbb 22 1003 ccc 33,上例的检索方法称为“定位检索”。如果是非定长格式,则需要用“遍历检索”。f2-1.dat wh

14、ile(!feof(fp)fscanf(fp,”%d%s%d”,T13-3-2.c 速度慢,但不受限制,综合例:已知文本文件f3.dat中存放有武汉市所有公民的有关性别和年龄的数据,请编写程序分别找出其中10名男寿星和10名女寿星,并将20名寿星的数据以文本文件的方式存入到文件f4.dat中(先男后女)。,说明:文件f3.dat中每行为一个公民的数据,共有3项,依次为:姓名(不超过10个字符)、性别(0表示男,1表示女)和年龄(整数),项间以空格分隔。未给出公民个数,将文件中的数据读完为止。,算法思想:开辟一个存放20名寿星数据的结果表a(结构体数组),然后逐个读取公民数据,每读取一个就向a中

15、“判断插入”一个,男性公民往前段插,女性公民往后段插。,读一个公民的数据到p,读完否?,N,Y,Wanghao 0 100Liming 0 98wudan 1 99xiaofang 1 95,男性插入,女性插入,寿星表a,#include typedef struct char name10;int sex;int age;PEP;,插入函数,将一个公民的数据插入到寿星表 从大到小void insert(PEP*x,int n,PEP t)int i,j;if(t.age xi.age)break;for(j=n-1;ji;j-)xj=xj-1;移位 xi=t;插入,main()int j;P

16、EP p,a20;FILE*fp;fp=fopen(“f3.dat”,”r”);if(!fp)exit(0);for(j=0;j20;j+)aj.age=0;while(!feof(fp)fscanf(fp,”%s%d%dn”,p.name,fp=fopen(“f3-1.dat”,”w”);for(j=0;j20;j+)fprintf(fp,”n%15s%2d%5d”,aj.name,aj.sex,aj.age);fclose(fp);T13-4.c,字符输入输出,标准输入输出putchar(ch);ch=getchar();文件输入输出fputc(ch,fp);putc(ch,fp);ch=fgetc(fp);ch=getc(fp);,字符串输入输出,标准输入输出puts(字符数组);gets(字符数组);文件输入输出int fputs(char*s,FILE*stream);char*fgets(char*s,int n,FILE*stream);,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号