第十章文件C文件概述文件类型指针文件的打开与关闭文件的读写文件的随机读写PDFcreatedwithpdfFactoryProtrialversion文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位,用文件名标识从操作系统的角度来看,任何和主机相连的输入输出设备都是文件——标准文件C语言中的文件是流式文件,即把文件看作是一个有序的字节流,文件以文件结束标志结束使用数据文件的目的d数据文件的改动不引起程序的改动——程序与数据分离d不同程序可以访问同一数据文件中的数据——数据共享d能长期保存程序运行的中间数据或结果数据PDFcreatedwithpdfFactoryProtrialversion文件概述文件分类v按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)v按数据的组织形式:文本文件:ASCII文件,文件中每一个元素都是字符二进制文件:把数据转换成二进制形式存储的文件源程序PDFcreatedwithpdfFactoryProtrialversion文本文件特点:存储量大、速度慢、便于对字符操作二进制文件特点:存储量小、速度快、便于存放中间结果如int型数100000010011100010000内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式‘1’‘0’‘0’‘0’‘0’PDFcreatedwithpdfFactoryProtrialversion文件处理方法v缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区v非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区vC语言使用缓冲文件系统程序数据区out(写)in(读)内存缓冲文件系统文件缓冲区out(写)in(读)特点:减少读写次数,提高速度和数据管理质量PDFcreatedwithpdfFactoryProtrialversion文件类型指针文件结构体FILEv运行文件时,必须知道与该文件有关的信息,如文件名、文件状态、文件缓冲区大小等。v缓冲文件系统为每个正使用的文件在内存开辟文件信息区,存放有关文件操作的信息v文件信息用系统定义的名为FILE的结构体描述vFILE结构体定义在stdio.h中★FILE结构体在程序中的使用:#includestdio.hFILE*filep1,*filep2;/*定义两个FILE类型指针*/PDFcreatedwithpdfFactoryProtrialversion文件类型指针文件结构体FILEv运行文件时,必须知道与该文件有关的信息,如文件名、文件状态、文件缓冲区大小等。v缓冲文件系统为每个正使用的文件在内存开辟文件信息区,存放有关文件操作的信息v文件信息用系统定义的名为FILE的结构体描述vFILE结构体定义在stdio.h中★FILE结构体在程序中的使用:#includestdio.hFILE*filep1,*filep2;/*定义两个FILE类型指针*/stdio.h中定义:typedefstruct{shortlevel;/*缓冲区被占用的程度,“满”或“空”*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/shortbsize;/*缓冲区的大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*文件定位指针*/unsignedistemp;/*暂时文件指示器*/shorttoken;/*用于有效性检查*/}FILE;FILE类型的结构与操作系统有关,即该结构体中成员随系统对文件处理方式的不同而不同。PDFcreatedwithpdfFactoryProtrialversion文件类型指针v指针变量声明:FILE*fp;文件名文件使用方式文件类型指针C程序操作系统磁盘v用法:文件打开时,系统自动建立文件结构体,并返回指向该文件的指针,程序通过指针获得文件信息,并对文件进行访问文件关闭后,相应的文件结构体被释放PDFcreatedwithpdfFactoryProtrialversion文件的打开与关闭JC文件操作用库函数实现,包含在stdio.hJ文件使用方式:打开文件-文件读/写-关闭文件J允许同时打开20个文件v系统自动打开和关闭三个标准设备文件:标准输入------键盘stdin标准输出------显示器stdout标准出错输出-----显示器stderrv其余文件必须实施打开/关闭操作FILE*PDFcreatedwithpdfFactoryProtrialversion功能:按指定方式打开文件v返值:正常打开,为指向文件结构体的指针;打开失败,为NULL要打开的文件名打开文件fopenv函数原型:FILE*fopen(char*name,char*mode)使用文件方式“r+/rb+”(读写)“a/ab”(追加)“w/wb”(只写)“r/rb”(只读)“w+/wb+”(读写)“a+/ab+”(读写)为读取打开一个文本/二进制文件为写入打开或建立一个文本/二进制文件为读/写打开一个文本/二进制文件为读/写建立一个文本/二进制文件为读/写打开或建立一个文本/二进制文件向文本/二进制文件尾追加数据文件使用方式含义PDFcreatedwithpdfFactoryProtrialversion打开文件fopenv函数原型:FILE*fopen(char*name,char*mode)v功能:按指定方式打开文件v返值:正常打开,为指向文件结构体的指针;打开失败,为NULL例FILE*fp;fp=fopen(“c:\\cprogram\\test.dat”,”r”);例FILE*fp;fp=fopen(“c:\cprogram\test.dat”,”r”);warning:unrecognizedcharacterescapesequencePDFcreatedwithpdfFactoryProtrialversion打开文件fopenv函数原型:FILE*fopen(char*name,char*mode)v功能:按指定方式打开文件v返值:正常打开,为指向文件结构体的指针;打开失败,为NULL例FILE*fp;fp=fopen(“c:\\cprogram\\test.dat”,”r”);例文件打开与测试FILE*fp;fp=fopen(“aa.c”,“w”);if(fp==NULL){printf(“Fileopenerror!\n”);exit(0);}PDFcreatedwithpdfFactoryProtrialversion打开文件fopenv函数原型:FILE*fopen(char*name,char*mode)v功能:按指定方式打开文件v返值:正常打开,为指向文件结构体的指针;打开失败,为NULL说明:Ø凡是读文件操作(含有r的),所打开文件必须是已存在的,不能对不存在文件实行读操作;Ø凡是写文件操作(含有w的),所打开文件可以是已存在/不存在。不存在时先建立文件(不能新建文件夹);存在时将原文件内容覆盖,写入新内容;Ø凡是含有a的,以追加方式打开的文件也可以是不存在的。不存在时,先建立文件再追加;若文件存在,在原文件尾追加新内容;PDFcreatedwithpdfFactoryProtrialversion文件关闭fclosev作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针v函数原型:intfclose(FILE*fp)v功能:关闭fp指向的文件v返值:正常关闭为0;出错时,非0磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统fclose不关闭文件可能会丢失数据PDFcreatedwithpdfFactoryProtrialversion文件的读写v常用的读写函数有四类字符I/O字符串I/O按格式I/O数据块I/Ov一.读/写一个字符1.fputc()函数v功能:把一个字符写到指定的文件中l原型#includestdio.hintfputc(intch,FILE*fp);向fp所指的文件写一个字符ch返回值:成功——所写字符失败——EOF(-1)PDFcreatedwithpdfFactoryProtrialversion(){charc,*fname=“c:\\Text;FILE*fp;}if((fp=fopen(fname,w))==NULL){printf(\nCan'topen%sfile!\n,fname);exit(0);}while()fputc(c,fp);fclose(fp);例从键盘输入若干字符,逐个送到文件中,直到输入'\n'为止。(c=getchar())!='\n'PDFcreatedwithpdfFactoryProtrialversion()函数v功能:从指定的磁盘文件中读取一个字符ll原型#includestdio.hintfgetc(FILE*fp);从fp所指文件中读入一个字符并返回调用成功——读入的字符失败或读结束——EOF(-1)例把一个文本文件按顺序读出并显示出来:while()putchar(ch);(ch=fgetc(fp))!=EOFPDFcreatedwithpdfFactoryProtrialversion()函数v功能:从指定的磁盘文件中读取一个字符ll原型#includestdio.hintfgetc(FILE*fp);例把一个二进制\文本文件按顺序读出并显示出来:while()putchar(fgetc(fp));m二进制文件不使用EOF判断文件结束m使用专用文件结束函数feof()m返回值:1——读结束(文件尾)0——未结束!feof(fp)PDFcreatedwithpdfFactoryProtrialversionØ文件顺序读写的实现:文件类型指针:FILE*fp;文件定位指针:指示文件当前读写位置unsigned文件状态标志short缓冲区大小unsignedchar*缓冲区位置unsignedchar*文件定位指针flagsbsize*burf*curp……fp文件类型指针文件定位指针——指向文件当前读/写的位置初始时指向文件的第一个字符①顺序读写:读/写完成后,自动向后移动②随机读写:先移动该指针到适当位置,再进行读/写操作PDFcreatedwithpdfFactoryProtrialversion((c=getchar())!='\n')fputc(c,fp);☺文件的顺序写curpHellcurpcurpcurpwhile(!feof(fp))putchar(fgetc(fp));curpcurpcurpcurpHellocurpcurpHelloocurpcurp☺