资源描述
,*,第12章,文件,文件的概述,文件的打开与关闭,文件的读写,文件的定位,出错检测,12,.1 文件的概述,1文件定义,文件是指存放在外部存储介质上的数据集合。,为标识一个文件,每个文件都必须有一个文件名,其一般结构为:,主文件名.扩展名,文件命名规则,遵循操作系统的约定。,2文件分类,可以从不同的角度对文件进行分类:,(1)根据文件的内容,可分为程序文件和数据文件,程序文件又可分为源文件、目标文件和可执行文件。,(2)根据文件的组织形式,可分为顺序,存取文件和随机存取文件。,(3)根据文件的存储形式,可分为,ASCII,码文件和二进制文件。,ASCII,码文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与,ASCII,码之间的转换)。,二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能直接输出字符形式。,3读文件与写文件,所谓读文件是指,将磁盘文件中的数据传送到计算机内存的操作。,所谓写文件是指,从计算机内存向磁盘文件,中传送数据的操作。,4文件类型,FILE,系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为,FILE。,注意,:结构类型名“,FILE”,必须大写。,12.2,文件的打开与关闭,文件的打开,fopen(),函数,1用法:,FILE *fopen(,文件名,操作方式);,2功能:返回一个指向指定文件的指针。,3函数原型:,stdio.h。,注,:对文件操作的库函数,函数原型均在头文件,stdio.h,中。后续函数不再赘述。,(3)于,exit(),函数,1)用法:,void exit(,程序状态值);,2)功能:关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为时,表示程序正常退出;非值时,表示程序出错退出。,(4)“,r(b)+”,与“,a(b)+”,的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。,(5)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。,文件的关闭,fcolse(),函数,1用法:,int fclose(FILE *,文件指针);,2功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为;否则,返回值为非。,例如,,fclose(fp);/*,关闭,fp,所指向的文件*/,注意,:文件使用完后必须将其正常关闭,,否则,容易丢失数据。,12.3 文件的读写操作,单个字符的读写,字符串的读写,数据块的读写,文件格式化的读写,if(fp=fopen(argv1,“w”)=NULL),printf(can not open this filen);,exit(0);,for(;(ch=getchar()!=;),fputc(ch,fp);,fclose(fp);,程序运行情况:,abcdefg1234567,库函数,fputc(),:,1),用法:,int fputc(,字符数据,文件指针);,其中“字符数据”,既可以是字符常量,也可以是字符变量。,2)功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。,如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量,EOF(,其值在头文件,stdio.h,中,被定义为-1)。,if(fp=fopen(argv1,r)=NULL),printf(can not open source filen);,exit(0);,for(;(ch=fgetc(fp)!=EOF;),putchar(ch);,fclose(fp);,程序运行情况:,abcdefg1234567,案例12.3,实现制作,ASCII,码文件副本的功能。,#,include stdio.h,main(int argc,char*argv),FILE*input,*output;,char ch;,if(argc!=3),printf(the number of arguments not correctn);,printf(n Usage:,可执行文件名,source-file,dest-file);,exit(0);,if(fp=fopen(argv1,r)=NULL),printf(can not open source filen);,exit(0);,if(fp=fopen(argv2,“w”)=NULL),printf(can not create destination filen);,exit(0);,for(;(!feof(input);),fputc(fgetc(input),output);,fclose(input);fclose(output);/*,关闭源文件和目标文件*/,12.3.2,读写字符串,案例12.4,将键盘上输入的一个长度不超过80的字符串,以,ASCII,码形式存储到一个磁盘文件中;然后再输出到屏幕上。,#,include stdio.h,main(int argc,char*argv),FILE*fp;,char string81;,if(argc2),printf(Too many parametersnn);,printf(Usage:,可执行文件名,filenamen);,exit(0);,if(argc=1)/*,缺磁盘文件名,提示输入*/,printf(Input the filename:);,gets(string);/*,借用,string,暂存输入的文件名*/,argv1=(char*)malloc(strlen(string)+1);,/*,给文件名参数申请内存空间*/,strcpy(argv1,string);/*,复制文件名到形参中*/,if(fp=fopen(argv1,w)=NULL)/*,打开文件失败*/,printf(can not open this filen);,exit(0);,/*,从键盘上输入字符串,并存储到指定文件中*/,printf(Input a string:);gets(string);/*,从键盘上输入字符串*/,fputs(string,fp);/*,存储到指定文件*/,fclose(fp);,if(fp=fopen(argv1,r)=NULL)/*,打开文件失败*/,printf(can not open this filen);,exit(0);,fgets(string,strlen(string)+1,fp);,printf(“Output the string:”);puts(string);,fclose(fp);,(1)为增强程序的可靠性,程序中对参数过多的情况,提示出错、并终止程序运行;而遗漏文件名时,提示用户输入。,同时,为增强程序的人机交互性,凡是需要用户输入数据的地方,都设置提示输入的信息;凡是输出数据的地方,都设置输出说明信息。,(2)库函数,fputs(),向指定文件输出一个字符串,1)用法:,int fputs(,字符串,文件指针);,其中“字符串”可以是一个字符串常量,或字符数组名,或字符指针变量名。,2)功能:向指定文件输出一个字符串,同时将读写位置指针向前移动,strlength(,字符串长度)个字节。如果输出成功,则函数返回值为;否则,为非值。,(3)库函数,fgets(),从文件中读一个字符串,1)用法:,char *fgets(,指针,串长度+1,文件指针);,2)功能:从指定文件中读入一个字符串,存入“字符数组指针”中,并在尾端自动加一个结束标志0;同时,将读写位置指针向前移动,strlength(,字符串长度)个字节。,如果在读入规定长度之前遇到文件尾,EOF,或换行符,读入即结束。,12.3.3 读写一个数据块,ANSI C,标准设置了,fread(),和,fwrite(),函数来1次读写1个数据块。,1用法:,int fread(void*buffer,int size,int count,FILE*fp);,int fwrite(void*buffer,int size,int count,FILE*fp);,2,功能:,fread(),从,fp,所指向文件的当前位置开始,一次读入,size,个字节,重复,count,次,并将读入的数据存放到从,buffer,开始的内存中;同时,将读写位置指针向前移动,size*count,个字节。,其中,,buffer,是存放读入数据的起始地址(即存放何处)。,12.3.4,对文件格式化读写,与,scanf(),和,printf(),函数的功能相似,区别在于:,fscanf(),和,fprintf(),函数的操作对象是指定文件,而,scanf(),和,printf(),函数的操作对象是标准输入(,stdin),输出(,stdout),文件。,int fscanf(,文件指针,格式符,输入变量首地址表);,int fprintf(,文件指针,格式符,输出参量表);,例如,.,int i=3;float f=9.80;,.,fprintf(fp,%2d,%6.2f,i,f);,.,fprintf(),函数的作用是,将变量,i,按%2,d,格式、变量,f,按%6.2,f,格式,以逗号作分隔符,输出到,fp,所指向的文件中:3,9.80(表示1个空格)。,12.4 位置指针与文件定位,12.4.1 位置指针复位函数,rewind(),1,用法:,int rewind(,文件指针);,2功能:使文件的位置指针返回到文件头。,12.4.2 随机读写与,fseek(),函数,对于流式文件,既可以顺序读写,也可随机读写,关键在于控制文件的位置指针。所谓顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。,所谓随机读写是指,读写完当前数据后,可通过调用,fseek(),函数,将位置指针移动到文件中任何一个地方。,1用法:,int fseek(,文件指针,位移量,参照点);,2功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。,(1)参照点:用0(文件头)、1(当前位置)和(文件尾)表示。,(2)位移量:以参照点为起点,向前(当位移量时)或后(当位移量时)移动的字节数。在,ANSI C,标准中,要求位移量为,long int,型数据。,fseek(),函数一般用于二进制文件,。,12.4.3 返回文件当前位置的函数,ftell(),由于文件的位置指针可以任意移动,也经常移动,往往容易迷失当前位置,,ftell(),就可以解决这个问题。,1用法:,long ftell(,文件指针);,2功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。,如果返回值为-1,L,,则表明调用出错。例如:,offset=ftell(fp);,if(offset=-1L)printf(“ftell()errorn”);,12.5 出错检测,12.5.1,ferror(),函数,在调用输入输出库函数时,如果出错,除了函数返回值有所反映外,也可利用,ferror(),函数来检测。1用法:,int ferror(,文件指针);,2功能:如果函数返回值为0,表示未出错;如果返回一个非0值,表示出错。(1)对同一文件,每次调用输入输出函数均产生一个新的,ferror(),函数值。因此在调用了输入输出函数后,应立即检测,否则出错信息会丢失。(2)在执行,fopen(),函数时,系统将,ferror(),的值自动置为0。,顫邠偾兆詧渐毑喂葪聋驩頭闱悴糺辟乙藈鼈珞稗趋鍨蠪絒笮喠礁讒烨礘暸燁縱苛汎并艮蠭豈砑疨呬恐蝃琄贮畾奉谈梷貎蠳侘錧
展开阅读全文