资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,文件处理方法,缓冲文件系统,:,高级,文件系统,系统自动为正在使用的文件开辟内存缓冲区,非缓冲文件系统,:低级文件系统,由用户在程序中为每个文件设定缓冲区,上节内容回顾,typedef struct,short level;/,*,缓冲区,“满”或“空”的程度*,/;,unsigned flags;/,*,文件状态标志*,/,char fd;/,*,文件描述符*,/,unsigned char hold;/,*,如无缓冲区不读取字符*,/,short bsize;/,*,缓冲区的大小*,/,unsigned char*buffer;/,*,数据缓冲区的位置*,/,unsigned char*curp;/,*,指针当前的指向*,/,unsigned istemp;/,*,临时文件,指示器*,/,short token;/,*,用于有效性检查*,/,FILE;,文件结构体FILE,打开文件,fopen,函数原型:,FILE *,fopen,(char *,name,char*,mode,),文件关闭,fclose,函数原型:,int fclose,(FILE *,fp,),“,r+/,rb,+”(,读写,),“,a/,ab,”(,追加,),“,w/,wb,”(,只写,),“,r/,rb,”(,只读,),“,w+/,wb,+”(,读写,),“,ab,+”(,读写,),为,输入,打开一个文本/二进制文件,为,输出,打开一个文本/二进制文件,为读/写打开一个文本/二进制文件,为读/写建立一个文本/二进制文件,为读/写打开二进制文件,向文本/二进制文件尾,追加,数据,文件使用方式,含义,字符,I/O:,fputc,与,fgetc,fputc,函数原型,:,int fputc,(,int,c,FILE*,fp,),功能:把一字节代码,c,写入,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,),feof,函数原型:,int feof,(FILE *,fp,),功能:判断文件是否结束,返值:文件结束,返回真(非0);文件未结束,返回0,数据块,I/O:,fread,与,fwrite,size_t,fread,(void *buffer,size_t 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,一般用于,二进制文件,的输入/输出,例 从键盘输入4个学生数据,把他们转存到磁盘文件中去,#,include,#define SIZE,4,struct,student_type,char name10;,int num,;,int,age;,char,addr,15;,studSIZE;,main(),int,i;,for(i=0;iSIZE;i+),scanf,(%s%d%d%s,studi.name,&studi.,num,&studi.age,studi.,addr,);,save,(),;,display,(),;,void save(),FILE*,fp,;,int,i;,if(,fp,=,fopen,(d:,jzitdqxstu.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,);,void display(),FILE*,fp,;,int,i;,if(,fp,=,fopen,(d:,jzitdqxstu.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);,13.5,文件的定位,几个概念,文件位置指针-指向当前读写位置的指针,读写方式,顺序读写:位置指针按字节位置顺序移动,叫,随机读写:位置指针按需要移动到任意位置,叫,rewind,函数,函数原型:,void rewind(FILE *,fp,),功能:重置文件位置指针到文件开头,返值:无,例 对一个磁盘文件进行显示和复制两次操作,#,include,main(),FILE*fp1,*fp2;,fp1=,fopen(d:jzitdqxdq2002_1.c,r);,fp2,=fopen(d:jzitdqxdq2002_2.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值,文件指针,位移量(以起始点为基点,移动的字节数),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*fp;,if,(fp=fopen(stu.dat,rb)=NULL,),printf(cant open filen);exit(0);,for(i=0;inum,p-score);,p=p-next;,while(p!=NULL);,p,p,本例中的所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“,静态链表,”。,11.7.3,处理动态链表所需的函数,1、,malloc,函数,原型,:void *malloc(unsigned int size);,功能,:在内存的动态存储区中分配一个长度为size的连续空间,返回值,:返回一个指向分配域起始地址的指针(类型为void),分配不成功,返回NULL,2、,calloc,函数,原型,:void *calloc(unsigned n,unsigned size);,功能,:在内存的动态存储区中分配n个长度为size的连续空间,返回值,:返回一个指向分配域起始地址的指针(类型为void),3、,free,函数,原型,:void free(void*p);,功能,:释放由p指向的内存区,使之能被其它变量使用。,例:写一函数建立一个有3名学生数据的单向动态链表。,定义3个指针变量,p1,p2,head,它们均指向struct student类型数据。,用malloc函数来开辟结点。,我们约定学生学号不为0,如为0则表示建立链表的过程完成,先使head的值为NULL,即链表为空链表。,开辟一个新结点,并使p1,p2指向它,读入一个学生数据给p1所指的结点,head=NULL,n=0,当读入的p1-num不是零,n=n+1,n 等于1?,真,head=p1,(把p1所指的结点,作为第一个结点),假,p2-next=p1,(把p1所指的结,点连接到表尾),p2=p1(p2移到表尾),再开辟一个新结点,使p1指向它,读入一个学生数据给p1所指结点,表尾结点指针变量置NULL,p1,p2,head,99101,89.5,n=1,流程图,p2,head,99101,89.5,n=1,p1,99103,90,n=2,流程图,head,99101,89.5,n=1,p1,99103,90,n=2,p2,流程图,head,99101,89.5,n=1,99103,90,n=2,p2,p1,99107,85,n=3,流程图,p2,head,99101,89.5,n=1,99103,90,n=2,p1,99107,85,n=3,流程图,p1,p2,head,99101,89.5,n=1,99103,90,n=2,99107,85,n=3,0,0,NULL,流程图,链表建立结束,#include“malloc.h”,#define NULL 0,#define LEN sizeof(struct student),struct student,long num;,flota score;,struct student*next;,;,int n;,struct student*creat(void);,struct student*head;,struct student*p1,*p2;,n=0;,p1=p2=(struct student*)malloc(LEN);,scanf(“%ld,%f”,head=NULL;,while(p1-num!=0),n=n+1;,if(n=1)head=p1;,else p2-next=p1;,p2=p1;,p1=(struct student*)malloc(LEN);,scanf(“%ld,%f”,p2-next=NULL;,return(head);,main(),.,creat();,.,开辟一个新结点,并使p1,p2指向它,读入一个学生数据给p1所指的结点,head=NULL,n=0,当读入的p1-num不是零,n=n+1,n 等于1?,真,head=p1,(把p1所指的结点,作为第一个结点),假,p2-next=p1,(把p1所指的结,点连接到表尾),p2=p1(p2移到表尾),再开辟一个新结点,使p1指向它,读入一个学生数据给p1所指结点,表尾结点指针变量置NULL,返回,
展开阅读全文