1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,概述,开关文件,读写文件,文件定位,第七章,文 件,文件:存储在外部介质上数据的集合,是操作系统数据管理的单位,文件分类,按文件的逻辑结构:,记录文件:由具有一定结构的记录组成(定长和不定长),流式文件,:由一个个字符(字节)数据顺序组成,按存储介质:,普通文件:存储介质文件(磁盘、磁带等),设备文件,:非存储介质(键盘、显示器、打印机等),按数据的组织形式:,文本文件,:,ASCII,文件,每个字节存放一个字符的,AS
2、CII,码,二进制文件,:数据按其在内存中的存储形式原样存放,C,文件概述,使用数据文件的目的,1,、数据文件的改动不引起程序的改动,程序与数据分离,2,、不同程序可以访问同一数据文件中的数据,数据共享,3,、能,长期保存,程序运行的中间数据或结果数据,如,int,型数10000,0010011100010000,内存存储形式,0010011100010000,二进制形式,0011000100110000001100000011000000110000,ASCII,形式,文本文件特点,:,存储量大、速度慢、便于对字符操作,二进制文件特点,:,存储量小、速度快、便于存放中间结果,如,int,型数
3、10000,0010011100010000,内存存储形式,0010011100010000,二进制形式,0011000100110000001100000011000000110000,ASCII,形式,文本文件特点,:,存储量大、速度慢、便于对字符操作,文件处理方法,缓冲文件系统,:,高级,文件系统,系统自动为正在使用的文件开辟内存缓冲区,非缓冲文件系统,:低级文件系统,由用户在程序中为每个文件设定缓冲区,磁盘文件,输出文件缓冲区,输入文件缓冲区,程序数据区,a,缓冲文件系统:,缓冲区,指令区,程序,用户数据区,磁盘,非缓冲文件系统:,文件类型指针,文件结构体,FILE,缓冲文件系统为每个
4、正使用的文件在内存开辟文件信息区,文件信息用系统定义的名为,FILE,的结构体描述,FILE,定义在,stdio.h,中,typedef struct,int _fd;,/,文件号,int _cleft;,/,缓冲区中剩下的字符数,int _mode;,/,文件操作方式,char *_next;,/,文件当前读写位置,char *_buff;,/,文件缓冲区位置,FILE;,文件类型指针,指针变量说明:,FILE *fp;,用法:,文件打开,时,系统,自动,建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得,文件信息,访问文件,文件关闭,后,它的文件结构体被释放,文件名,文件使用,方
5、式,文件类型指针,C,程序,操作系统,磁盘,文件的基本操作步骤,各步骤的含义.,指向文件的指针变量,在“,stdio.h”,中,struct _iobuf,char _FAR_ *_ptr;,int _cnt;,char _FAR_ *_base;,char _flag;,char _file;,;,typedef struct _iobuf FILE;,打开文件,读写(创建)文件,关闭文件,typedef struct,int _fd;/*,文件号*/,int _cleft;/*,缓冲区剩下的字符*/,int _,mode;/*,文件操作模式 */,char *_nextc;/*,下一个字符
6、指针*/,char *_buff ;/*,文件缓冲区指针 */,FILE,;,例如:,FILE *fp1,*fp2;,1.打开文件,FILE *fp;,fp=fopen(filename,mode);,filename,中可以带路径名。,一般方法如下:,FILE *fp;,if(fp=fopen(“c:docexam.txt”,“w”)=NULL),puts(“Cannot open the filen”);,exit(1);,开关文件,Mode(,方式),意 义,“,r”,读文本文件,“,w”,写生成文本文件,“,a”,向文本文件追加,“,rb”,读打开二进制文件,“,wb”,写生成进制文件
7、ab”,向二进制文件追加,打开方式(,mode),Mode(,方式)意 义,“,r+”,读写文本文件,“,w+”,读写(创建)文本文件,“,a+”,向文本文件追加,“,rb+”,“读打开”二进制文件,“,wb+”,读写(创建)二进制文件,“,ab+”,向二进制文件读写(追加),打开方式(,mode),2.关闭文件,一般方法如下:,fclose(FilePointer);,或:,if(fclose(filepointer)=,=NULL)printf(“close error”);exit(2);,使用,FILE,类型和,fopen(),、fclose(),函数应包含,stdio.h,1.
8、输入输出字符,1),I/O,字符,ch=fgetc(fp);,fputc(ch,fp);,putchar(ch),实际上是用,fputc(ch,fp),定义的一个宏:,#,define putchar(ch)fputc(ch,stdout),默认输出到标准输出设备-显示器即标准输出文件,stdout,。,2),判断文件尾,fgetc(),在读到文件末尾时,返回文件结束标志,EOF,(,在,stdio.h,中定义为-1。此标志只适合于文本文件,二进制文件中的数值-1会与其相混,造成提前结束。,常用,feof(),函数测试文件尾。若是文件结,束返回值1。它既可以用于二进制文件也可,以用于文本文件。
9、读写文件,2.输入输出数据块,一次可,I/O,一个数组或结构体类型的数据,后者与其它高级语言的记录读写。,ANSI C,设置了两个函数:,fread(buffer,size,count,fp),fwrite(buffer,size,count,fp),例,从键盘输入5个学生的数据,存为文本文件,然后读回验证,。,3.格式化,I/O,fprintf(fp,formstr,outlist),fscanf(fp,formstr,outlist),文件的读写,字符,I/O:fputc,与,fgetc,fputc,函数原型,:,int fputc(int c,FILE*fp),功能:把一字节代码,c,
10、写入,fp,指向的文件中,返值:正常,返回,c;,出错,为,EOF,fgetc,函数原型:,int fgetc(FILE*fp),功能:从,fp,指向的文件中读取,一字节代码,返值:正常,返回读到的代码值;读到文件尾或出错,为,EOF,文件,I/O,与终端,I/O,#define putc(ch,fp)fputc(ch,fp),#define getc(fp)fgetc(fp),#define putchar(c)fputc(c,stdout),#define getchar()fgetc(stdin),判断,二进制,文件是否结束,while(!,feof,(fp),c=fgetc(fp);,
11、例 文件拷贝,例 从键盘输入字符,逐个,存到磁盘文件中,直到,输入,#“,为止,#include,main(),FILE*fp;,char ch,*filename=“out.txt”;,if(fp=fopen(filename,w)=NULL),printf(cannot open filen);,exit(0);,printf(Please input string:);,ch=getchar();,while(ch!=#),fputc(ch,fp);,putchar(ch);,ch=getchar();,fclose(fp);,例 读文本文件内容,,并显示,#include,main
12、),FILE*fp;,char ch,*filename=“out.txt”;,if(fp=fopen(filename,”r)=NULL),printf(cannot open filen);,exit(0);,while(,ch=fgetc(fp),)!=,EOF,),putchar(ch);,fclose(fp);,判断文本文件是否结束,feof,函数原型:,int feof(FILE *fp),功能:判断文件是否结束,返值:文件结束,返回真(非0);文件未结束,返回0,#include,main(),FILE*in,*out;,char ch,infile10,outfile10;,
13、scanf(%s,infile);,scanf(%s,outfile);,if(in=fopen(infile,r)=NULL),printf(Cannot open infile.n);,exit(0);,if,(out=fopen(outfile,w)=NULL,),printf(Cannot open outfile.n);,exit(0);,while(!feof(in),fputc(fgetc(in),out);,fclose(in);,fclose(out);,数据块,I/O:fread,与,fwrite,函数原型:,size_t fread(void *buffer,size_t
14、 size,size_t count,FILE *fp),size_t fwrite(void *buffer,size_t size,size_t count,FILE *fp),功能:读,/,写数据块,返值:成功,返回读,/,写的块数;出错或文件尾,返回,0,说明:,typedef unsigned size_t;,buffer:,指向要输入/输出数据块的首地址的指针,size:,每个要读/写的数据块的大小(字节数),count:,要读/写的数据块的个数,fp:,要读/写的文件指针,fread,与,fwrite,一般用于,二进制文件,的输入/输出,例,float f2;,FILE *fp;
15、fp=fopen(“aa.dat”,“rb”);,fread(f,4,2,fp);,for(i=0;i2;i+),fread(,例,struct student,int num;,char name20;,char sex;,int age;,float score3;,stud10;,for(i=0;i10;i+),fread(,例 从键盘输入,4,个学生数据,把他们转存到磁盘文件中去,#include,#define SIZE 2,struct student_type,char name10;,int num;,int age;,char addr15;,studSIZE;,main(
16、),int i;,for(i=0;iSIZE;i+),scanf(%s%d%d%s,studi.name,&studi.num,save();,display();,void save(),FILE*fp;,int i;,if(,fp=fopen(d:fengyiexestu_dat,wb)=NULL,),printf(cannot open filen);,return;,for(i=0;iSIZE;i+),if,(fwrite(&studi,sizeof(struct student_type),1,fp)!=1,),printf(file write errorn);,fclose(fp
17、);,void display(),FILE*fp;,int i;,if(,fp=fopen(d:fengyiexestu_dat,rb)=NULL,),printf(cannot open filen);,return;,for(i=0;i0),fputs(string,fp);,fputs(n,fp);,fclose(fp);,if(,fp=fopen(file.txt,r)=NULL,),printf(cannt open file);exit(0);,while(,fgets(string,81,fp)!=NULL,),fputs(string,stdout);,fclose(fp);
18、1.返回文件开头,rewind(fp),2.随机定位,fseek(fp,偏移量,起始点),起始点 名字 数字表示,文件开始,SEEK_SET 0,文件当前位置,SEEK_CUR 1,文件末尾,SEEK_END 2,偏移量可以用+/-表示向前或向后移动。,文件定位,文件的定位,几个概念,文件位置指针,-,指向当前读写位置的指针,读写方式,顺序读写:位置指针按字节位置顺序移动,叫,随机读写:位置指针按需要移动到任意位置,叫,rewind,函数,函数原型:,void rewind(FILE *fp),功能:重置文件位置指针到文件开头,返值:无,例 对一个磁盘文件进行显示和复制两次操作,#inclu
19、de,main(),FILE*fp1,*fp2;,fp1=,fopen(d:fengyibkcch12_4.c,r);,fp2,=fopen(d:fengyibkcch12_41.c,w);,while,(!feof(fp1,)putchar(getc(fp1);,rewind(fp1);,while(!feof(fp1),putc(getc(fp1),fp2);,fclose(fp1);,fclose(fp2);,fseek,函数,函数原型:,int fseek(FILE *fp,long offset,int whence),功能:改变文件位置指针的位置,返值:成功,返回0;失败,返回非0
20、值,文件指针,位移量(以起始点为基点,移动的字节数),0,向后移动,0,向前移动,起始点,文件开始,SEEK_SET 0,文件当前位置,SEEK_CUR 1,文件末尾,SEEK_END 2,例,fseek(fp,100L,0);,fseek(fp,50L,1);,fseek(fp,-10L,2);,ftell,函数,函数原型:,long ftell(FILE *fp),功能:返回位置指针当前位置(用相对文件开头的位移量表示),返值:成功,返回当前位置指针位置;失败,返回-1,L,,,例 磁盘文件上有,3,个学生数据,要求读入第,1,,,3,学生数据并显示,main(),int i;,FILE*
21、fp;,if,(fp=fopen(studat,rb)=NULL,),printf(cant open filen);exit(0);,for(i=0;i3;i+=2),fseek(fp,i*sizeof(struct student_type),0);,fread(,printf(%s%d%d%sn,studi.name,studi.num,studi.age,studi.addr);,fclose(fp);,#include,struct student_type,int num;,char name10;,int age;,char addr15;,stud3;,#includestdi
22、o.h,main(),FILE*fp;,char filename80;,long length;,gets(filename);,fp=fopen(filename,rb);,if(fp=NULL),printf(file not found!n);,else,fseek(fp,0L,SEEK_END);,length=,ftell(fp);,printf(Length of File is%1d bytesn,length);,fclose(fp);,例 求文件长度,(ch12_101.c),例如:,exfile1.c,exfcopy.c,exfcpy2.c,exrw1.c,exsp1.c,exwst.c,谢谢观看!,






