您好,欢迎访问三七文档
第十二章文件【教学要求】1.了解文件的概念。2.了解文件类型指针的定义和含义。3.掌握文件操作的相关标准函数。4.掌握文件定位的操作及相关的标准函数。6.了解出错检测函数的作用。7.了解非缓冲文件系统的各种操作。•文件的概念文件的类型文件的操作文件的概念1、文件的含义:文件(file)是程序设计中一个重要的概念。所谓“文件”一般指:存储在外部介质上数据的集合,一批数据是以文件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据.在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这就要用到磁盘文件。2、文件型结构的定义:一个结构体类型typedefstruct{int_fd;/*文件号int_cleft;/*缓冲区剩下的字节int_mode;/*文件操作模式char*_nextc;/*下一个字节位置char*_buff;/*文件缓冲区位置}FILE;3、文件类型指针:FILE一种新的指针类型,在TC中,在stdio.h文件中有它的类型定义可以定义文件型指针变量。如FILE*fp;fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。文件的类型1、按数据的组织形式分:c语言把文件看作是一个字符的序列(流式文件)。根据数据的组织形式,可分为•ASCII文件:又称文本文件(text),每个字节存放一个ASCII代码,代表一个字符.•二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上,存放时不进行数据格式的转换。如果有一个整数10000,在内存中占2个字节,如果按ASCII形式输出,则占5个字节,而按二进制形式输出,在磁盘上只占2个字节。以二进制形式存储数据要比以ASCII形式节省空间.2、按对文件的处理方式分:带缓冲区与不带缓冲区的文件缓冲文件和非缓冲文件1、缓冲文件:系统为每个正在使用的文件在内存中开辟一个缓冲区,当磁盘和内存交换数据时,首先把数据存放在缓冲区,然后再进行数据的交换。2、非缓冲文件:系统不自动为文件开辟固定大小的缓冲区,而是由程序具体确定。程序数据区输入文件缓冲区输出文件缓冲区磁盘数据内存文件的基本操作•文件的打开与关闭•文件的读写•文件的定位与测试•综合举例文件的打开与关闭一、文件的打开:1、功能:将文件指针指向用户要操作的文件,并使文件处于可用状态。2、格式:fp=fopen(文件名,文件的打开方式);3、使用方法:二、文件的关闭1、功能:将文件指针与所指的文件“脱钩”,并回收文件所占的内存空间。并强制实现缓冲区数据存盘。应该养成在程序终止之前关闭所有使用的文件的习惯,如果不关闭文件将会丢失数据.2、格式:fclose(文件指针);3、例如:fclose(fp);文件的打开方式文件打开方式含义r只读为输入打开一个文本文件w只写为输出打开一个文本文件a追加向文本文件追加数据rb只读为输入打开一个二进制文件wb只写为输出打开一个二进制文件ab追加向二进制文件追加数据r+读写为读/写打开一个文本文件w+读写为读/写建立一个文本文件a+读写为读/写打开一个文本文件rb+读写为读/写打开一个二进文件wb+读写为读/写建立一个二进文件ab+读写为读/写打开一个二进文件说明:1.如果不能实现打开任务,则函数fopen()代回一个空指针NULL.常用以下方法测试文件打开是否成功:if((fp=fopen(“f1.dat”,”r”)==NULL){printf(“canotopenthisfile\n”);exit(0);}–文件打开成功:意味着可以对文件进行相应的操作。–文件打开失败:意味着磁盘空间不足或磁盘有问题,不能对文件进行相应的操作。2.注意各种打开方式的功能,区分二进制文件和文本文件,以及读写方式.一、单个字符的读、写函数二、字符串的读、写函数三、格式化读、写函数四、数据块的读、写函数五、其他读写函数文件的读写单个字符的读、写函数1.fputc()功能:将一个字符写到磁盘文件中去。格式:fputc(ch,fp);2.fgetc()功能:从指定文件读入一个字符,该文件必须是以读和读写方式打开的.格式:ch=fgetc(fp);说明:(1)对于文本文件,文件结束标志为EOF,其值为-1;(2)对于二进制文件用函数feof(fp)来判定文件是否结束.(3)应用举例:例:将一个磁盘文件中信息复制到另外的磁盘文件中去.#includestdio.hmain(){FILE*in,*out;charch,infile[10],outfile[10];scanf(“%s”,infile);scanf(“%s”,outfile);if((in=fopen(infile,”r”)==NULL)&&(out=fopen(outfile,”w)==NULL)){printf(“cannotopeninfileoroutfile\n”);exit(0);}while(!feof(in))fputc(fgetc(in),out);fclose(in);fclose(out);}字符串的读、写函数1、fgets()功能:从指定文件读入一字符串.格式:fgets(str,n,fp);如:fgets(str,10,fp);从指定的文件中读入10个字符串,存放到字符数组str中2、fputs()功能:向指定文件输出一字符串.格式:fputs(str,fp);如:fputs(“Chine”,fp);将字符串Chine存入fp指定的文件中去.格式化读、写函数1、fprintf()功能:将内存中的数据按一定的格式输出到磁盘文件中。格式:fprintf(文件指针,格式字符串,输出表列)2、fscanf()功能:将文件指针所指的磁盘数据按一定的格式读入内存中。格式:fscanf(文件指针,格式字符串,输入表列)3、举例:fscanf(fp,”%d”,&i);fprintf(fp,”%d”,i);1、函数:fread()与fwrite()2、功能:将一组数据从磁盘文件中输入或输出。3、格式:fread(buffer,size,count,fp)fwrite(buffer,size,count,fp)4、参数说明:buffer:是缓冲区的地址,对于fread()来说,是读入数据存放的地址,对于fwrite()来说,是要输出数据的起始地址;size:要读写的字节数;count:要读写多少个size字节的数据项;fp:文件行指针.5、应用例如:数据块的读、写函数例:从键盘读入四个学生的有关数据,然后将其放入磁盘文件中去.#includestdio.h主函数#defineSIZE4structstudent{charname[10];intnum,age;charaddr[15];}stud[SIZE];voidsave(){FILE*fp;inti;if((fp=fopen(“stu_list”,”wb”)==NULL){printf(“cannotopenfile\n”);exit(0);}for(i=0;iSIZE;i++)if(fwrite(&stud[i],sizeof(structstudent),1,fp)!=1)printf(“filewriteerror\n”);}main(){inti;for(i=0;isize;i++)scanf(“%s%d%d%s”,stud[i].name,stud[i].num,stud[i].age,stud[i].addr);save();}存入磁盘中的数据,可以用fread()将其读出,请自己编写一个程序完成.1、函数putw(),getw()的功能:对磁盘文件读写一个字(整数)。2、格式:putw(n,fp);getw(fp);3、用法:putw(10,fp);将整数10输出到fp指向的文件中去.i=getw(fp);从磁盘文件读入一个数到内存变量。其他读写函数文件的定位与测试函数一、用于文件定位的函数1、rewind():使文件位置指针重新返回文件的开头处。2、fseek(fp,位移量,起始点):使文件位置指针移到指定的位置。3、ftell(fp):返回相对与文件开头的指针位置值。二、检测文件是否结束的函数foef()返回值为1:表示文件位置指针已指向文件尾;返回值为0:表示文件位置指针指向文件开始。例:试编写程序,建立一个文本文件data1,并将本周内家庭收入与支出情况写入该文件中。#include<stdio.h>main(){FILE*fp;floata;if((fp=fopen(data1,w))==NULL){printf(Cannotopenthefile!);exit(0);}while(1){scanf(%f,&a);if(a==0)break;fwrite(&a,sizeof(float),1,fp);}fclose(fp);}例:编写程序,用命令行参数方法将上题所建立的文本文件data1中的数据输出两遍。#include<stdio.h>main(intargc,char*argv[]){FILE*fp;floata;if((fp=fopen(argv[1],r))==NULL){printf(Cannotopentheffile!);exit(0);}while(1){fread(&a,sizeof(float),1,fp);if(feof(fp)==0)printf(%.2f\n,a);elsebreak;}rewind(fp);printf(\n);while(1){fread(&a,sizeof(float),1,fp);if(feof(fp)==0)printf(%.2f\n,a);elsebreak;}fclose(fp);}
本文标题:第13章文件操作
链接地址:https://www.777doc.com/doc-3663777 .html