第十二章文件内容提要文件缓冲型文件的打开、关闭与读写文件I/O文件:就是存储在外部存储介质上的数据的有序集合;存储在磁介质上的文件即使在断电之后,依然能够保存。C语言的源文件存储为*.c文件,经过编译后得到的目标文件存储为*.obj,生成的可执行文件,存储为*.exe文件。C的文件分为两大类,普通文件和设备文件。C对文件的存取是以字符为单位的。11.1文件普通文件保存在外部磁介质上,而把各种外设看成是设备文件。对显示器的输出看成是对设备文件进行写操作键盘的输入看成是设备文件的读操作显示器是标准输出文件,键盘是标准输入文件11.1文件磁介质存储文件文件存储在磁介质上,有的按照ASCII码存储,有的按照二进制编码存储ASCII码文件按照ASCII码进行存储,这种文件能够被人所看懂。ASCII码保存的文件被称为文本文件。如:‘A’保存为65‘a’保存为97‘1’保存为49二进制文件以内存中的二进制编码保存。这些文件人是没办法读懂的11.1文件ASCII码文件如果用ASCII码来保存的话,需要将2009看成占4个字节的字符串。2对应的ASCII码为50二进制表达为001100100对应的ASCII码为48二进制表达为001100000对应的ASCII码为48二进制表达为001100009对应的ASCII码为57二进制表达为00111001二进制文件2009如果用二进制文件保存的话,首先要将2009这个数字转换为二进制数:0000011111011001占两个字节,不足部分补0。11.1文件00110010001100000011000000111001从普通文件读数据时,从磁盘文件中读一批数据到划分出的缓冲区中,然后从缓冲区将数据逐个送入相对应的变量中;向文件写数据时,是先将变量中数据送到缓冲区,在缓冲区满后,将缓冲区内的数据一起存到普通磁盘文件中。11.1文件文件类型指针用一个指针变量指向一个文件,通过对文件指针的操作,来对这个指针所指向的文件进行操作。文件指针声明的一般形式为:FILE*指针变量名;FILE为系统定义的一个结构体,包含文件的各种信息。如:文件名,文件当前位置,文件状态,缓冲区大小等等FILE是包含在stdio.h中11.1文件FILE的定义为:typedefstruct{shortlevel;/*fill/emptylevelofbuffer*/unsignedflags;/*Filestatusflags*/charfd;/*Filedescriptor*/unsignedcharhold;/*Ungetccharifnobuffer*/shortbsize;/*Buffersize*/unsignedchar*buffer;/*Datatransferbuffer*/unsignedchar*curp;/*Currentactivepointer*/unsignedistemp;/*Temporaryfileindicator*/shorttoken;/*Usedforvaliditychecking*/}FILE;11.1文件FILE类型的指针变量声明为:FILE*fp;fp为指针变量,按照结构体中的成员变量所提供的信息,就可以找到文件,对文件进行操作。不必弄清楚FILE的每一个细节,只用声明一个指针变量,指向这内存中划出的FILE结构体变量空间的首地址就可以了11.1文件标准文件标准文件是特殊的设备文件,显示器、键盘和错误输出文件。这些标准文件指针是C定义的,并由C自动打开和关闭。这三个标准文件分别是:标准输入文件,指针为stdin:键盘。标准输出文件,指针为stdout:显示器。标准错误输出文件,指针为stderr:输出错误信息11.1文件操作文件的步骤:打开文件使用(包括读或写)关闭文件11.2缓冲型文件的打开、关闭和读写打开文件实际上就是让文件指针指向一个内存区域,文件的各种信息被调入并存放在这个内存区域中。fopen()函数,文件打开函数,用来以一个特定的打开方式来打开一个文件,一般形式为:FILE*fp;fp=fopen(文件名,文件打开方式);fp为文件指针,这个指针指向FILE结构体变量的首地址。文件名为被打开文件的名字;在名字之前,可以加上路径;文件名,可以是字符数组或者字符串常量。文件打开方式,则是要如何操作文件。11.2缓冲型文件的打开、关闭和读写打开方式:由r(read),w(write),a(append),t(text),b(binary),+,组合而成对文本文件(text)的基本操作:rt(只读文本文件)、wt(只写文本文件)、at(追加文本文件)对二进制文件(binary)的基本操作:rb(只读二进制文件)、wb(只写二进制文件)、ab(追加二进制文件)书写的时候对表达文本文件的t可以省略r表达的是只读方式,以只读方式将文件打开,将文件信息调入内存;若文件打开不成功,则返回NULL。w表达的是只写方式,以只写方式将文本文件打开。若文件不存在,则在磁盘上相应的位置新建一个文件;若文件已存在,则去除掉原来该文件中所有信息,重新往该文件中写入缓冲区信息a表达的是追加方式,以只写方式将文本文件打开。若文件不存在,则返回空值NULL;若文件已存在,在原来的文件数据后,写入缓冲区信息。+的意思是读和写都允许。+经常与这6种方式一起,如:rt+,rb+,w+,等11.2缓冲型文件的打开、关闭和读写关闭文件关闭文件是指的断开指针与文件之间的联系,释放文件缓冲区fclose()函数,文件关闭函数,当文件调用结束后,要使用fclose()函数把文件关闭。一般形式为:fclose(fp);fp为文件指针,这个指针指向FILE结构体变量的首地址。正常关闭的时候将返回0值,而发生错误的时候返回非0。11.2缓冲型文件的打开、关闭和读写fgetc()函数:fgetc()从文件中读取一个字符若操作成功,则返回读入的字符,若操作不成功,或者文件结束,则返回EOF。一般使用方式:charch;FILE*fp;文件以只读或者读写打开之后,ch=fgetc(fp);将fp指针指向的那个文件中的一个字符读出来,赋值给ch,11.2缓冲型文件的打开、关闭和读写从一个已知的文件中读入所有的字符,打印显示到屏幕上#includestdio.hvoidmain(){FILE*fp;charc;charfile[30];printf(inputdirectoryandfile:);gets(file);if((fp=fopen(file,r))==NULL){printf(openerroronreading\n,file);exit(0);}while((c=fgetc(fp))!=EOF)putchar(c);fclose(fp);}11.2缓冲型文件的打开、关闭和读写fputc()函数:往文本文件中写入一个字符若操作成功,则返回写入的字符,若操作不成功,则返回EOF。一般使用方式:fputc(字符,文件指针);将字符写入到文件指针所指的那个文件中去文件必须以只写或者读写或者追加方式打开使用w方式,文件内部指针会从文件头开始,重新写入,使用a方式,则是从已存在的文件尾部,继续写入。11.2缓冲型文件的打开、关闭和读写键盘输入字符串,将字符串记录到指定文本文件中,最后在屏幕上打印出这个文本文件中的内容字符串以回车结束11.2缓冲型文件的打开、关闭和读写#includestdio.hvoidmain(){FILE*fp;charc;charfile[30];printf(inputdirectoryandfile:);gets(file);if((fp=fopen(file,w))==NULL){printf(openerroronwritingin\n);exit(0);}while((c=getchar())!='\n'){fputc(c,fp);}fclose(fp);if((fp=fopen(file,r))==NULL){printf(openerroronreading\n);exit(0);}while((c=fgetc(fp))!=EOF)putchar(c);fclose(fp);}fread()函数与fwrite()函数:fread与fwrite是用来整块的读写数据的。11.2缓冲型文件的打开、关闭和读写fread()函数fread的一般形式为:fread(buffer,size,n,fp);•若操作成功,从fp所指向的文件中,读取n个数据项,存放到buffer指针所指向的内存区域,并且返回读出的数据项个数•若文件结束或操作失败,则返回011.2缓冲型文件的打开、关闭和读写fwrite()函数fwrite的一般形式为:fwrite(buffer,size,n,fp);•若操作成功,则将buffer指针所指向的内存区域中的n个数据项,写入fp所指向的文件中,•若操作失败,则返回011.2缓冲型文件的打开、关闭和读写在EMPLOYEE职工信息系统中,输入数据,保存到文件中去,并且从文件中读出数据11.2缓冲型文件的打开、关闭和读写#includestdio.hvoidmain(){structemployee{intEId;charname[20];chartel[10];floatsalary;}*pemp,*p;FILE*fp1,fp2;floattemp;if((fp1=fopen(c:\\tc\\example.txt,w+))==NULL){printf(openerroronwritingin);exit(0);}printf(inputEId:);scanf(%d,&pemp-EId);printf(inputname:);scanf(%s,pemp-name);printf(inputtel:);scanf(%s,pemp-tel);printf(inputsalary:);scanf(%f,&temp);pemp-salary=temp;11.2缓冲型文件的打开、关闭和读写fwrite(pemp,sizeof(structemployee),1,fp1);fclose(fp1);if((fp2=fopen(c:\\tc\\example.txt,r+))==NULL){printf(openerroronreading);exit(0);}fread(p,sizeof(structemployee),1,fp2);printf(newemployee'sdetail:\n);printf(Eid\tname\ttel\t\tsalary\n);printf(%d\t%s\t%s\t%.2f\n,p-EId,p-name,p-tel,p-salary);fclose(fp2);}fprintf函数与fscanf函数fprintf函数与fscanf函数实际上与printf,scanf很相似不同的是scanf与printf是从键盘和屏幕进行读写,而fscanf,fprintf则是对普通文件进行操作。scanf和fprintf的格式字符控制符,与scanf,printf的格式控制符相同。11.3文件的I/Ofprintf函数fprintf的一般使用形式:fprintf(文件指针,格式控制符,输入表);若操作成功,则将输出项按照制定格式写入文件指针所指向的文件中,并且返回写入的字节数。若操作不成功,则返回EOF11.3文件的I/Ofscanf函数fscanf的一般使用形势:fscanf(文件指针,格式控制符,输入表);若操作成功,则从文件指针所指向的文件中读取数据,送到指定的内存地址中,并且返回实际读出的数据项个数,若没有读取数据项则返回0。若操作不成功,或者文件结束,则返回EOF。11.3文