第十章文件C文件的有关概念10.1文件是一组存储在外存储设备上的数据的集合。1什么是文件操作系统是以文件为单位对数据进行管理的。输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),即输入输出流。C语言把文件看作是一个字符(字节)的序列,即文件是由一个一个字符(字节)的数据顺序组成。一个输入输出流就是一个字节流或二进制流。保存和交换数据。保存大容量数据。3文件的分类:①数据表示方式:二进制文件。文本文件(ASCII)文件。②读写方式:顺序读写文件(流式)。随机读写文件。③处理方法:缓冲文件。非缓冲文件。Device内存Buffer匹配主机速度,数据转换。2文件的优点:⒈文件的操作过程打开文件建立一个文件和流的对应关系。在内存中建立一个保存文件信息的结构变量。读写文件关闭文件释放文件所占的资源。10.2文件的操作过程与文件指针⒉文件指针(FilePointer)在缓冲文件系统中,每个被使用的文件的信息(如文件名、位置、类型等)都保存在一个特殊定义的结构体类型的指针变量中。该结构体类型由用户定义,名为:FILE可以定义一个指向FILE类型的结构体指针,打开文件是让该指针指向文件对应的结构变量,通过该指针对文件进行操作。FILE*fp;•fp是FILE型指针变量•fp标识一个特定的磁盘文件•typedefstruct{shortlevel;/*缓冲区‘满’或‘空’的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读字符*/shortbsize;/*缓冲区的大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*指针当前的指向*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于有效性检查*/}FILE;•在stdio.h文件中定义3文件读写的方式文件按读写方式可以分为:顺序读写随机读写顺序读写:顺序向后读写。随机读写:给定位置读写。10.3文件的打开与关闭⒈文件的打开函数fopen()fopen函数的原型在stdio.h文件中说明,该函数的作用是打开缓冲文件。使用方法:FILE*fp;fp=fopen(filename,mode);打开文件的文件名或设备名。文件的读写方式。文件信息结构的指针。fp=fopen(“a:\wang.dat”,”w+”);说明:⑴如果fopen失败,则函数返回空指针NULL;⑵当文件打开错误时,程序不应继续执行,一般以如下方式打开文件:if((fp=fopen(filename,mode))==NULL){printf(“FileOpenError!\n”);exit(1);}文件的读写方式说明:控制符文件类型读写方式“r”文本打开文件只读“w”建立新文件只写“a”打开文件在尾部追加“rb”二进制打开文件只读“wb”建立新文件只写“ab”打开文件在尾部追加“r+”文本打开文件可读写“w+”建立新文件可读写“a+”打开文件可读写“rb+”二进制打开文件可读写“wb+”建立新文件可读写“ab+”打开文件可读写⒉文件的关闭函数fclose()文件使用完必须关闭,关闭文件的目的是:保证文件的数据不丢失,将buffer的数据回写文件。释放buffer。关闭文件函数的使用:fclose(文件指针);FILE*fp;fp=fopen(“a:\d.dat”,”w+”);/*文件的读写*/…fclose(fp);说明:如果关闭正确fclose返回0;关闭失败fclose返回非0。10.4文件的顺序读写文件的读写是由定义在stdio.h中的一组函数的集合所实现的。⒈字符输入和输出函数fputc函数和fgetc函数⑴fputc函数使用方法:fputc(ch,fp);含义:将字符ch写入文件指针对应的文件的当前位置。返回值:写入正确返回ch的值;失败返回EOF(在stdio.h中定义为-1)。⑵fgetc函数使用方法:ch=fgetc(fp);/*ch为字符型变量。*/含义:从文件指针fp对应的可读文件的当前位置读一个字符返回赋值给ch。⑶feof函数使用方法:i=feof(fp);含义:判断文件是否结束。返回值:1代表文件结束;0代表文件未结束。【例10-1】从键盘输入10个字符,写入文件f2.txt中。#includestdio.h#includestdlib.hvoidmain(void){inti;charch;FILE*fp;/*定义文件指针*/if((fp=fopen(“c:\\f2.txt”,“w”))==NULL)/*以写方式打开文件*/{printf(Fileopenerror!\n);exit(1);/*无法打开则结束*/}for(i=1;i=10;i++)/*循环10次*/{ch=getchar();/*从键盘输入字符*/fputc(ch,fp);/*将字符写入文件*/}if(fclose(fp))/*关闭文件*/{printf(Filecloseerror!\n);exit(1);/*无法关闭则结束*/}}#includestdio.h#includestdlib.hvoidmain(void){inti;charch;FILE*fp;/*定义文件指针*/if((fp=fopen(f1.txt,w))==NULL)/*以写方式打开文件*/{printf(Fileopenerror!\n);exit(1);/*无法打开则结束*/}for(i=1;i=10;i++)/*循环10次*/{ch=getchar();/*从键盘输入字符*/fputc(ch,fp);/*将字符写入文件*/}if(fclose(fp))/*关闭文件*/{printf(Filecloseerror!\n);exit(1);/*无法关闭则结束*/}【例10-2】从键盘输入10个字符,写入文件f1.txt中,再从此文件中读出字符显示在屏幕上。If((fp=fopen(“f1.txt”,“r”))==NULL)/*再次打开文件以读方式*/{printf(Fileopenerror!\n);exit(1);}for(i=1;i=10;i++){ch=fgetc(fp);/*从文件读入字符*/putchar(ch);/*将字符输出到屏幕*/}if(fclose(fp))/*关闭文件*/{printf(Filecloseerror!\n);exit(1);}}#includestdio.h#includestdlib.hvoidmain(void){charch;FILE*fin,*fout;/*定义文件指针*/if((fin=fopen(“c:\\f1.txt”,“r”))==NULL)/*以读方式打开文件*/{printf(Fileopenerror!\n);exit(1);}if((fout=fopen(c:\\f4.txt,w))==NULL)/*以写方式打开文件*/{printf(Fileopenerror!\n);exit(1);/*无法打开则结束*/}【例10-3】将磁盘文件f1.txt中的内容复制到另一个文件f4.txt中。while((ch=fgetc(fin))!=EOF){fputc(ch,fout);/*从文件fin读出字符写入文件fout*/}if(fclose(fin))/*关闭文件*/{printf(Filecloseerror!\n);exit(1);/*无法关闭则结束*/}if(fclose(fout))/*关闭文件*/{printf(Filecloseerror!\n);exit(1);/*无法关闭则结束*/}}⒉文件中字符串的输入和输出函数⑴字符串输入函数使用方法:fgets(str,n,fp);含义:从fp所对应的文件的当前位置读n-1个字符到str所指向的内存单元。并在结束处加‘\0’表示字符串结束。三种情况可以使输入结束:读完n-1个字符;读出时遇到‘\n’;读出时遇到文件结束标志。⑵字符串输出函数使用方法:fputs(str,fp);含义:将str指向的字符串,输出到fp所对应的文件中,并忽略输出字符串结束标志‘\0’。#includestdio.h#includestdlib.hvoidmain(void){charch[80];FILE*fin,*fout;/*定义文件指针*/if((fin=fopen(“e:\\f5.txt,r))==NULL)/*以读方式打开文件*/{printf(Fileopenerror!\n);exit(1);}if((fout=fopen(f6.txt,w))==NULL)/*以写方式打开文件*/{printf(Fileopenerror!\n);exit(1);/*无法打开则结束*/}【例10-4】利用字符串输入输出函数将一个磁盘文件中的内容f5.txt复制到另一个文件f6.txt中。while(!feof(fin)){fgets(ch,80,fin);/*从文件fin读出字符*/fputs(ch,fout);/*写入文件fout*/}if(fclose(fin))/*关闭文件*/{printf(Filecloseerror!\n);exit(1);/*无法关闭则结束*/}if(fclose(fout))/*关闭文件*/{printf(Filecloseerror!\n);exit(1);/*无法关闭则结束*/}}⒊文件的格式化输入和输出函数fp文件指针format,格式说明字符串,取%d、%x、%f、%c等;说明输入转化的格式。&arg1…&argn,接收读出数据的变量的地址列表。⑴格式化输入函数fscanf使用方法:fscanf(fp,format,&arg1,&arg2,…&argn);含义:从fp对应的文件的当前位置,顺序读出一个字符序列,按format说明的格式和类型进行转换并存放到对应变量单元。#includestdio.h#includestdlib.hvoidmain(void){chars[80];inta;FILE*fp;if((fp=fopen(“e:\\text.txt”,“r”))==NULL){printf(“cannotopenfile“);exit(0);}fscanf(fp,“%s%d“,s,&a);printf(“%s,%d”,s,a);}打开文件读出数据。例10-5:从text.txt中读字符串和一个十进制数,输出到显示器。fp文件指针;format,格式说明字符串,取%d、%x、%f、%c等;说明输出转化的格式。arg1…argn,输出量列表。使用方法:fprintf(fp,format,arg1,……argn);含义:以指定的格式(format),将arg1…argn的值,写入fp文件的当前位置。FILE*fp;fp=fopen(“s.dat”,”w”);…fprint(fp,”%d%c”,123,’c’);fclose(fp);⑵格式化输出函数fprintf⒋文件的数据块输入输出函数buf(空类型指针)接收数据的地址;size(整型)一次读取数据的字节数;count(整型)读取次数;fp对应输入文件的文件指针。⑴fread()函数使用方法:fread(buf,size,count,fp);含义:从fp指向的文件的当前位置,每次读取size个字节,共读count次数据,存放到buf指向的内存处。返回值:调用正确,返回输入的项数;调用错误,返回-1(EOF)。FILE*fp;charstr[80];fp=fopen(“s.dat”,”r”);fread(str,20,3,fp);#includestdio.h#includestdlib.hvoidmain(void){inti;flo