1 / 16

第十章 文件

授课目的: 理解文件的概念、 C 文件的分类和文件的存取方式,会编写简单的文件处理程序 授课内容: 第一节 文件的基本概念 第二节 文件处理采用的函数 第三节 文件程序设计实例 要点、要求及作业. 第十章 文件. 一、概念 文件:存储在外部介质上数据的集合。(用文件来保存数据) 操作系统以文件为单位对数据进行管理,前面介绍的 I/O 都是以终端文件为对象,此为磁盘文件。 二、分类 1 、按文件内容来分: 程序文件和数据文件 2 、从文件的存储方式上可分为:

alden
Télécharger la présentation

第十章 文件

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 授课目的: 理解文件的概念、C文件的分类和文件的存取方式,会编写简单的文件处理程序 授课内容: 第一节 文件的基本概念 第二节 文件处理采用的函数 第三节 文件程序设计实例 要点、要求及作业 第十章 文件

  2. 一、概念 文件:存储在外部介质上数据的集合。(用文件来保存数据) 操作系统以文件为单位对数据进行管理,前面介绍的I/O都是以终端文件为对象,此为磁盘文件。 二、分类 1、按文件内容来分: 程序文件和数据文件 2、从文件的存储方式上可分为: ASCII文件(文本文件):每个字节存放一个ASCII(既一个字符) 二进制文件:同内存存储形式 例:整数1000; 在ASCII文件中,占4个字节(把每个数字看成是一个字符 ) 00110001 00110000 00110000 00110000 在二进制文件中,则2个字节,为 00000111 10101000 3、按存储介质划分 磁盘文件、磁带文件 光盘文件、打印文件 4、按读写方式来分 分为:顺序文件和随机文件 C对文件是一个字节流或二进制流,故C语言对文件的存取以字符为单位。 第一节 文件的基本概念

  3. 三、处理方法 两种:缓冲文件系统和非缓冲文件系统 现在大都采用缓冲文件系统,系统为每个正使用的文件开辟一个缓冲区,对文件的存取都通过它进行。 四、文件的处理过程 通过“文件”可使数据大量永久保存在外存上,使之成为共享数据。 数据的处理分以下几种: 1、直接处理形式 键盘 内存变量 显示器 2、写文件处理形式 键盘 内存变量 文件指针 OS 外存 3、读文件处理形式 文件名 OS 文件指针 内存变量 显示器 4、修改文件处理形式 文件名 OS 文件指针 内存变量 文件指针 OS 文件名 输出文件缓冲区 磁盘 程序区 输入文件缓冲区 第一节 文件的基本概念

  4. 一、文件类型指针 缓冲文件系统为每个正使用的文件开辟一个区,存放文件的有关信息,这些信息保存在一结构体类型(FILE)的变量中,在“stdio.h”中定义如下: typedef struct {int _fd; /*文件号*/ int _cleft; /*缓冲区剩下的字符*/ int _mode; /*文件操作模式*/ char *_nextc; /*下一字符位置*/ char *_buff; /*文件缓冲区位置*/ }FILE; 则:FILE *fp; 二、文件的打开和关闭 文件使用之前,必须先打开,使用后要关闭。 打开文件:指使文件指针指向外存上某一个文件。 关闭文件;切断文件指针与外存上某一文件的联系,文件操作结束 操作系统以文件为单位对存储在外存储器中的数据进行管理,并按名存取. 即:要找外存上的数据,必须先按名称找存放数据的文件,然后才能读数据,要放数据,必须先建一个文件,才能向它输出数据. 第二节 文件处理采用的函数

  5. 1、文件的打开:fopen函数 格式: FILE *fp; fp=fopen(文件名,使用文件方式); 例: fp=fopen(“a1”,”r”); 其中:“r”:文本文件的只读方式 “w”:文本文件的只写方式 2、文件的关闭:fclose函数 格式:fclose(文件指针); 例:fclose(fp); 返回值:顺利关闭为0,否则为非0 三、文件的读写 方式:顺序读写和随机读写 (一)写入函数: 1、fputc 功能:把一字符写到fp所指向的磁盘文件上 形式:fputc(ch,fp); 其中:ch:输出的字符(常量或变量) fp:文件指针 作用:把ch输出到fp指向的文件上。 返回值:成功时返回输出字符,失败时返回EOF(-1)。 putchar由它派生: #define putchar(C) fputc(c,stdout) 2、fputs函数 格式: fputs(str,fp) 作用:把str表示的字符串写入到由fp指向的文件中(不写字符串的结束符‘\0’) 3、fprintf函数 格式:fprintf(文件指针,格式字符串、输出表列) 第二节 文件处理采用的函数

  6. 作用:把格式化的数据写入由文件指针指向的文件中。作用:把格式化的数据写入由文件指针指向的文件中。 (二)读取函数 1、fgec:从Fp指向的文件读入一个字符,并放到变量ch中 形式:ch=fgetc(fp); 返回值:一个字符,遇文件结束符,返回文件结束标志EOF(-1)。 例:从磁盘文件顺序读入字符并显示在屏幕上。 ch=fgetc(fp); while(ch!=EOF) {putchar(ch); ch=fgetc(fp); } while(!feof(fp)) 第二节 文件处理采用的函数 注:EOF仅作为文本文件的结束标志,对非文本文件用feof函数判断, 2、fgets函数 格式:fgets(str,n,fp) 功能:从fp指向的文件中读取n-1个字符并将其保存在str指定的内存单元中. 此函数执行成功时返回0,失败时返回非0值 3、fscanf函数 格式:fscanf(文件指针,格式字符串,输入表列) 功能:从文件指针指向的文件中读取格式化的数据.

  7. 第三节 文件程序设计实例 • 文件主要应用于以下四个方面: • 文件的建立、文件的查看、文件的修改、文件的复制 • 例1:从键盘输入一些字符,逐个把它们送到磁盘上,至到输入一个‘#’。 • 代码如下: • #include “stdio.h” • main() • {FILE *fp; • char ch,filename[10]; • scanf(“%s”,filename); • if((fp=fopen(filename,”w”))==NULL) • {printf(“can not open file\n”); • exit(0); } • while((ch=getchar())!=‘#’) • {fputc(ch,fp); putchar(ch); ch=getchar(); } • fclose(fp); • }

  8. 第三节 文件程序设计实例 • 例2:假设某班级学生的考试成绩表中包含学号,姓名,成绩.试设计程序建立一个成绩表. • 本题中使用的两个函数 • 1、fread(buffer,size ,count,fp) • 2、fwrite(buffer,size,count,fp) • 其中:buffer是一个指针变量,表示读写数据在内存中存放的起始地址,Size表示要读写数据的字节数据,Count表示是读写多少个size字节的数据项,fp表示已定义的指针变量。 • 此两函数调用成功,则函数返回值为count的值,即读写完整数据项的个数,否则返回值为-1。 • 代码如下:

  9. 第三节 文件程序设计实例 #include “stdio.h” struct {int num; char name[10]; int score; } stu; int len=sizeof(stu); main() {file *fp; int I,n; if((fp=fopen(“student.dat”,”wb”)) ==null) {printf(“can not open this file!”); exit(0); } printf(“请输入学生人数:”)} scanf(“%d”,&n); printf(“请按学号、姓名、成绩输入数据,数据间用空格分开”); for(i=0;i<n;i++) {scanf(“%d%s%d”,&stu.num,&stu.name,&stu.score); fwrite(&stu,len,1,fp); } fclose(fp); } 没指出文件的路径代表当前路径

  10. 第三节 文件程序设计实例 • 例3:从磁盘文件file1.txt中读回字符串,并在屏幕上显示出来。 • # include “stdio.h” • main() • {file *fp; • char string[81]; • if((fp=fopen(“file1.txt”,”r”))==null) • {printf(“can not open this file!”); • Exit(0);} • while(fgets(string,81,fp)!=null) • printf(“%s”,string); • fClose(fp); • }

  11. 第三节 文件程序设计实例 • 例4:对于上例建立的student.dat文件,读取其单号学生数据后在显示器上输出。 • 函数:fseek • 格式:fseek(文件类型指针,位移量,起始点) • 其中:起始点:0:代表文件开头 • 1:代表位置指针的当前位置 • 2:代表文件末尾 • “位移量”是指以“起始点”为基点移动的字节数,如果它的值是正值,表示从文件开始向文件末尾移动,反之,则相反,位移量应为long类型数据,这样当文件长度很长时不致出错。 • fseek函数执行成功时,返回值为0,否则返回一个非0值。 • fseek函数一般用二进制文件。 • 本题代码如下:

  12. 第三节 文件程序设计实例 #include “stdio.h” #include “stdlib.h” struct {int num; char name[10]; int score; } stud; int len=sizeof(stud); main() {int I; file *fp; if((fp=fopen(“student.dat”,”rb”)) ==null) {printf(“can not open this file!”); Exit(0); } For(i=0;i<5;i++) {fseek(fp,i*len,0) Fread(&stud,len,1,fp); If(stud.num%2!=0) Printf(“%d %s %d\n”,stud.num,stud.name,stud.score); } Fclose(fp); }

  13. 第三节 文件程序设计实例 例5:设计一个程序,使得对于任意一个c源程序文件,它能删除所有注释并得到一个新的源程序文件newone.c。 • #include “stdio.h” • Void main() • {int d; • Char name[20],x,y; • File *f,*g; • Printf(“”); • Scanf(“%s”,name); • F=fopen(name,”r”); • G=fopen(“newone”,”w”); • D=0; • While ((x=fgets(f))!=eof) • {if(d==0) • {if (x==‘/’) • if ((y=fgets(f))==‘*’) d=1; else { fputc(x,g); fputc(y,g); } else fputc(x,g); } else { if(x==‘*’) if((y=fgets(f))==‘/’) d=0;} } Fclose(f); Fclose(g); }

  14. 第三节 文件程序设计实例 • 例6:编一程序对例10-2中建立的学生成绩表文件student.dat中指定学生的成绩进行修改。 scanf(“%d”,&n); fseek(fp,(n-1)*len,0); if (fread(&stu,len,1,fp)!=0) {printf( “%d %s %d”, stu.num, stu.name, stu.score); scanf(“%c”,&ch); if(ch==‘y’) {printf(“请输入要改入的成绩:”); scanf(“%d”,&stu.score); fseek(fp,(n-1)*len,0); fwrite(&stu,len,1,fp); printf(“数据已修改!”) } } else printf(“不存在该学生!”); fclose(fp); } #include “stdio.h” struct {int num; char name[10]; int score; } stu; int len=sizeof(stu); main() {file *fp; int n; char ch; if((fp=fopen(“student.dat”,”rb+”)) ==null) {printf(“can not open this file!”); exit(0);} printf(“请输入要修改成绩的学号:”);

  15. #include “stdio.h” main() {FILE *in,*out; char ch,infile[10];outfile[10]; printf(“enter the infile name:”); scanf(“%s”,infile); printf(“enter the outfile name:”); scanf(“%s”,outfile) if((in=fopen(infile,”r”))==NULL) {printf(“can not open file\n”); exit(0); } if((out=fopen(outfile,”w”))==NULL) {printf(“can not open file\n”); exit(0); } while(!feof(in)) {ch=fgetc(in); fputc(ch,out); } fclose(in); fclose(out); } 也可以在命令行把两个文件名一起输入。这用到main的参数 第三节 文件程序设计实例 • 例7、将一个文件中的信息复制到另一个文件中。

  16. 要点、要求及作业 • 要点: • 文件的概念及分类 • 文件的常用操作 • 要求: • 理解文件的概念,会使用常用的文件处理函数 • 实验十六

More Related