收藏 分享(赏)

计算机C语言—第十三章.ppt

上传人:gnk289057 文档编号:10249208 上传时间:2019-10-25 格式:PPT 页数:41 大小:156.50KB
下载 相关 举报
计算机C语言—第十三章.ppt_第1页
第1页 / 共41页
计算机C语言—第十三章.ppt_第2页
第2页 / 共41页
计算机C语言—第十三章.ppt_第3页
第3页 / 共41页
计算机C语言—第十三章.ppt_第4页
第4页 / 共41页
计算机C语言—第十三章.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

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 文件类型指针每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件名、文件状态及文件当

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

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

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

6、lose 函数)在使用完一个文件后应用fclose 函数关 闭文件,形式为:fclose(文件指针);如: fclose(fp);关闭后fp不再指向该文件。,13.4 文件的读写文件打开后,就可以对它进行读写了。文本文件的读写即如何将以文本方式存放的文件输入到程序的数据结构中。如何将程序的数据结构中的数据以文本方式输出到文件中。读对象:以文本方式存放的文件写对象:以文本方式存放的文件,用于对文本文件读写的函数有:fscanf fprintffgetc, getc fputc, putcfgets fputs重点介绍 fscanf 和 fprintf。,以例子说明fscanf和fprintf的使

7、用。例:已知文本文件f1.txt中存放有100个学生的分数,要求读入这些数据,并按从高到低的顺序排序后输出到另一文件中。(输入输出的这些文件都在TC根目录下即可),#include “stdio.h” void sort(int *a,int n) main() int i,a100; FILE *fp; fp=fopen(“f1.txt”, “r”); if(fp=NULL) exit(0);,定义一个指向文件的指针变量,打开文件,使fp指向文件f1.txt,for(i=0;i100;i+)fscanf(fp,”%d”,a+i); fclose(fp); sort(a,100); fp=fo

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

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

10、 main() int a100; FILE *fp; fp=fopen(“f3.dat”,“rb”);,if(fp=NULL) exit(0); fread(a,sizeof(int),100,fp); fclose(fp); ,思考,到底何时用freadfwrite何时用fscanffprintf?是文本文件用后者二进制文件用前者还是说有格式控制需要的就用后者(如07年考试编程题)无格式控制的就可以用前者?仔细研究一下。,13.5 文件的定位文件中有一个位置指针,指向当前读写位置。如果顺序读写一个文件,每次读写完一个字符后,该位置指针自动指向下一个字符位置。如果想改变这样的规律,强制使位置

11、指针指向指定位置,可以用有关函数。,rewind函数rewind函数的作用是使位置指针重返回文件的开头。例:对文本文件f1.txt中的100个分数求超过平均分的人数。,#include “stdio.h” main() int i,a,n=0; float aver=0; FILE *fp; fp=fopen(“f1.txt”,“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函数可以

12、将位置指针指向所需的位置。 fseek函数调用的一般形式:fseek(文件指针,位移量,参考点);,以起始点为基准,向前移动的字节数,0 或 SEEK_SET 文件开始 1 或 SEEK_CUR 当前位置 2 或 SEEK_END 文件末尾,例:如果fp是指向一个存放100个整数的二进制文件,要读取第50个数到变量n时:fseek(fp,sizeof(int)*(50-1),SEEK_SET);fread(,例:如果fp是指向一个存放100个整数的文本文件,并已知每个数按3位数字的定长格式存放,要读取第50个数到变量n时:fseek ( fp, 3*(50-1), SEEK_SE );fsca

13、nf ( fp, ”%3d”, ,例:已知文本文件f5.dat中存放有100个学生的学号、姓名和考试成绩;要求从键盘输入任一学号,检索出相应学生的数据。 说明: (1)文件f5.dat中每行为一个学生的数据,按定长格式存放,依次为:学号(整数,占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 ( “f5.dat”

14、, ”r” ); scanf ( “%d” , ,1001 LiLi 90 1002 WangPing 100 1003 HuHeng 75,如果是二进制文 件呢?,上例的检索方法称为“定位检索”。 如果是非定长格式,则需要用“遍历检索”。while ( !feof ( fp ) ) fscanf ( fp, ”%d%s%d”, 速度慢,但不受限制,综合例:已知文本文件f1.dat中存放有武汉市所有公民的有关性别和年龄的数据,请编写程序分别找出其中10名男寿星和10名女寿星,并将20名寿星的数据以文本文件的方式存入到文件f2.dat中(先男后女)。,说明: 文件f1.dat中每行为一个公民的数

15、据,共有3项,依次为:姓名(不超过10个字符)、性别(0表示男,1表示女)和年龄(整数),项间以空格分隔。 未给出公民个数,将文件中的数据读完为止。,算法思想:开辟一个存放20名寿星数据的结果表a(结构体数组),然后逐个读取公民数据,每读取一个就向a中“判断插入”一个,男性公民往前段插,女性公民往后段插。,读一个公民的数据到p,读完否?,N,Y,Wanghao 0 100 Liming 0 98 wudan 1 99 xiaofang 1 95 ,男性插入,女性插入,寿星表a,#include typedef struct char name10;int sex;int age; PEP;,插

16、入函数,将一个公民的数据插入到寿星表 void insert (PEP *a, int n, PEP t ) int i,j; if ( t.age ai.age) break; for ( j=n-1; ji; j-) aj=aj-1; 移位 ai=t; 插入 ,main() int j; PEP p,a20; FILE *fp;fp=fopen (“f1.dat”,”r”); if(!fp) exit(0);for (j=0;j20;j+) aj.age=0;while( !feof ( fp ) ) fscanf ( fp, ”%s%d%d”, p.name,fp=fopen(“f2.dat”,”w”);for(j=0;j20;j+)fprintf(fp,”n%15s%2d%5d”,aj.name, aj.sex,aj.age );fclose ( fp ); ,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报