文件1引子输入处理输出键盘内存显示器磁盘磁盘文件scanfgetchargets...printfputcharputs...2第十一章文件本章学习要点正确理解文件的概念,文件系统的特点;掌握文件指针的概念和定义方法;熟练使用文件读写函数,学会定位文件指针。掌握本章内容的捷径:1.对文件永远是:打开——操作——关闭2.学会文件操作库函数(即标准I/O库函数)的用法3第十一章文件文件概述文件处理文件顺序读写文件随机操作文件检测文件实例411.1文件概述一.文件的定义存储在外部介质上(如磁盘和磁带等外存储器)的数据或信息的集合。例如:程序文件中保存着程序,而数据文件中保存着数据。main.cC语言源程序文本文件main.obj目标文件二进制文件main.exe可执行文件二进制文件511.1文件概述二.文件的性质文件是一个有序的数据序列,数据之间有着严格的排列次序关系,可以按照它们的排列顺序,依次进行访问,也可以按照需要,访问任意位置上的数据。6三.系统对文件的处理过程系统对文件的处理过程就是对文件进行输入/输出操作的过程。文件程序数据区输出文件缓冲区输入文件缓冲区计算机内存计算机外存写文件称为输出读文件称为输入711.1文件概述四.文件的分类文本文件二进制文件普通文件(磁盘文件)特殊文件(标准设备文件)缓冲文件系统非缓冲文件系统8从文件数据的组织形式(存储格式)看ASCII文件(或称文本文件,即TEXT文件)文本文件中的数据采用ASCII码格式存储,全部数据转换为ASCII码。每个ASCII字符占1个字节。ASCII文件使用文本编辑器可直接阅读。二进制文件对数据在内存中的二进制存储格式不做任何转换,直接存入文件,形成二进制文件。二进制文件在操作系统下不能直接阅读。911.1文件概述例如:将整数1024分别存储到ASCII文件和二进制文件中,将采用不同的编码形式,占用不同的字节长度。内存中的存储形式:补码0000010000000000ASCII文件:ASCII码’1’’0’’2’’4’二进制文件:补码0000010000000000占4个字节占2个字节10比较:ASCII文件中,每个字符以ASCII码形式存储,方便对字符的逐个处理;在操作系统下或使用文本编辑器时,可以直接阅读、修改,方便与其它系统进行数据交换。缺点是占用磁盘存储空间多,并且系统要付出将内存中的二进制形式转为ASCII码的时间开销。用二进制形式输出,可以节省磁盘空间和转换时间,但输出的数据因为是内存中的格式,在操作系统下和一般的编辑器中不能直接识别。1111.1文件概述从用户观点看普通文件(也称为磁盘文件)特殊文件(也称为标准设备文件或标准I/O文件)普通文件是以磁盘为对象且无其它特殊性能的文件。特殊文件是以终端为对象的标准的设备文件。1211.1文件概述在C语言中,“文件”的概念具有更广泛的意义。与每台主机相连的所有输入输出设备都看作是一个文件。即将实际的物理设备抽象为逻辑文件,它们也被称为设备文件。例如:键盘是输入文件stdin(标准输入文件)显示器是输出文件stdout(标准输出文件)打印机是输出文件PRN1311.1文件概述从C语言对文件的处理方法看缓冲文件系统非缓冲文件系统缓冲文件系统:对每个正在使用的文件,系统自动在内存中为其开辟一个文件缓冲区。称为高级文件操作。非缓冲文件系统:系统不会自动开辟缓冲区,文件缓冲区是由程序自己设置的。称为低级文件操作。1411.1文件概述在83年以后ANSIC标准中取消了非缓冲文件系统,对文本文件和二进制文件均统一采用缓冲文件系统进行处理。本课程学习:缓冲式文件操作方式下,对磁盘文件进行基本操作。对文本文件和二进制文件有不同的处理方式。使用标准输入/输出库(stdio.h)函数来实现文件操作。15第十一章文件文件概述文件处理文件顺序读写文件随机操作文件检测文件实例16一.文件类型FILE在缓冲文件系统中,用一个FILE类型的结构变量来描述一个文件,该结构变量用于存放文件的有关信息,如文件名、文件状态等。在C语言中,无论是一般磁盘文件还是设备文件,都要通过文件结构的数据集合进行输入输出处理。文件结构不需要用户自己定义,是由系统事先定义好的,包含在头文件stdio.h中,用户可以直接使用。11.2文件处理17文件结构类型FILE:typedefstruct{int_fd;/*文件位置指针,即当前文件的读写位置*/int_cleft;/*文件缓冲区中剩余的字节数*/int_mode;/*文件操作模式*/char*nextc;/*用于文件读写的下一个字符位置*/char*_buff;/*文件缓冲区位置(指针)*/}FILE;文件结构变量在打开文件时由操作系统自动建立,用户使用文件时无需重复定义。在使用文件的时候要使用文件包含命令:#includestdio.h类型说明语句typedef:定义新的类型来代替已有类型:typedefintINT1811.2文件处理二.如何引用文件结构——文件指针C语言中对文件的操作都要通过指向该文件结构的指针。文件指针变量说明形式:FILE*文件型指针变量名;例如:FILE*fp;/*fp是一个指针变量*/文件指针是程序和文件联系的纽带19三.使用文件的一般步骤打开文件→操作文件→关闭文件打开文件:建立用户程序与文件的联系,为文件开辟文件缓冲区。操作文件:是指对文件的读、写、追加和定位操作:读操作:将文件中的数据读入计算机。写操作:向文件输出数据。追加操作:将数据写到原有数据的后面。定位操作:移动文件读写位置指针。关闭文件:切断文件与程序的联系,将文件缓冲区的内容写入磁盘,并释放文件缓冲区。20打开文件(fopen)fopen函数的调用形式是:FILE*fp;fp=fopen(文件名,文件使用方式);文件名:需要打开的文件名称(字符串)。文件使用方式:是具有特定含义的符号。函数功能:按指定的文件使用方式打开指定的文件。若文件打开成功,则返回值为非NULL指针;若文件打开失败,返回NULL。为该文件建立一个文件结构(变量),然后让指针指向该文件结构例:fp=fopen(file1,r))2111.2文件处理文本文件的三种基本打开方式“r”:只读方式。为读(输入)文本文件打开文件。若文件不存在,则返回NULL。“w”:只写方式。为写(输出)文本文件打开文件。若文件不存在,则建立一个新文件;若文件已存在,则要将原来的文件清空。“a”:追加方式。在文本文件的末尾增加数据。若文件已存在,则保持原来文件的内容,将新的数据增加到原来数据的后面;若文件不存在,则创建。22二进制文件的三种基本打开方式“rb”:只读方式“wb”:只写方式“ab”:追加方式文件的其它打开方式“r+”:可对文本文件进行读/写操作。若文件不存在返回NULL;若文件存在,内容不会被清空。“w+”:可对文本文件进行读/写操作。若文件已经存在,则要先将文件原来的内容清空。“a+”:可对文本文件进行读/追加操作。“rb+”:可对二进制文件进行读/写操作。“wb+”:可对二进制文件进行读/写操作。“ab+”:可对二进制文件进行读/追加操作。23常见文件打开操作if((fp=fopen(filename,r))==NULL){printf(Cannotopenfile.\n);exit(0);/*打开文件出错,调用库函数终止程序*/}含义:以只读方式打开文件名为filename的文件。文件名可以是从盘符开始的完整路径名,也可以是相对路径。11.2文件处理2411.2文件处理练习:以下可作为函数fopen中第一个参数的正确格式是:A.c:user\text.txtB.c:\user\text.txtC.c:\user\text.txtD.c:\\user\\text.txt2511.2文件处理char*pfilename;……if((fp=fopen(pfilename,r))==NULL){printf(Cannotopenfile.\n);exit(0);}含义:以只读方式打开以pfilename指向的字符串为文件名的文件。26关闭文件(fclose)fclose函数的调用形式:FILE*fp;…..fclose(fp);fp:已经打开的文件指针。函数功能关闭fp指定的文件,切断缓冲区与该文件的联系,并释放文件指针。若文件关闭成功,返回值为0;若文件关闭失败,返回非0值。2711.2文件处理系统标准设备文件标准设备文件由系统自动打开和关闭,其文件结构的指针由系统命名,用户在程序中可直接使用。C语言中提供了三个标准设备文件的指针:stdin标准输入文件(键盘)stdout标准输出文件(显示器)stderr标准错误输出文件(显示器)28第十一章文件文件概述文件处理文件顺序读写文件随机操作文件检测文件实例2911.3文件顺序读写一.文件顺序操作对文件的操作(文件读写)必须按文件中字符的先后顺序进行,只能在操作了第i个字符之后,才能操作第i+1个字符。在对文件操作时,文件的位置指针由系统自动向前(文件尾方向)移动。3011.3文件顺序读写进行顺序操作的函数:字符输入输出函数fgetcfputc字符串输入输出函数fgetsfputs格式化输入输出函数fscanffprintf数据块输入输出函数freadfwrite31键盘文件内存显示器文件磁盘文件磁盘文件scanfgetchargets...printfputcharputs...fscanffgetcfgetsfread...fprintffputcfputsfwrite...32二.字符输入输出(fgetc/fputc)输入函数:ch=fgetc(fp);fp为已经打开的文件的指针函数功能:从指定的文件中读取一个字符。即:从fp所指向的文件(该文件必须是以读或读写方式打开的)中读取一个字符返回,读取的字符赋给变量ch。若读取字符时文件已经结束或出错:对于ASCII文件,文件结束时,返回文件结束标记EOF(-1);对于二进制文件,要使用feof函数来判断文件是否结束。3311.3文件顺序读写输出函数:fputc(ch,fp);ch为需要输出的字符函数功能:将一个字符输出到指定文件中。即将字符变量ch中的字符输出到fp所指向的文件。若输出操作成功,该函数返回输出的字符;否则,返回EOF。34例:显示一个文本文件的内容#includestdio.hintmain(){FILE*fp;charfilename[20],ch;printf(Enterfilename:);scanf(%s,filename);/*输入文件名*/if((fp=fopen(filename,r))==NULL)/*打开*/{printf(“fileopenerror.\n”);/*出错处理*/exit(0);}while((ch=fgetc(fp))!=EOF)/*读字符*/putchar(ch);fclose(fp);/*关闭文件*/}35例:使用标准输出文件显示文本文件内容#includestdio.hintmain(){FILE*fp;charfilename[20],ch;printf(Enterfilename:);scanf(%s,filename);/*输入文件名*/if((fp=fopen(filename,r))==NULL)/*打开*/{printf(“fileopenerror.\n”);/*出错处理*/exit(0);}while((ch=fgetc(fp))!=EOF)/*读字符*/fputc(ch,stdout);/*向标准输出文件输出(显示)*/fclose(fp);/*关闭文件*/}36例:复制文本文件intmain(){FILE*fp1,*fp2;charfile1[20],file2[20],ch;printf(Enter