第10章文件教学目标•1.理解文件和文件指针的概念;•2.学会在C语言中进行文件操作的基本方法;本章结构:文件的基本概念:什么是文件?如何进行文件的分类?文件指针:什么是文件指针?它的基本作用是什么?文件的打开和关闭:文件的打开和关闭是什么含义?如何进行打开和关闭的操作?文件的基本操作函数:各种读写函数和检测函数的使用文件:是指一组相关数据的有序集合。文件名:这个数据集有一个名称,叫做文件名。10.1文件概念例如:我们使用过的文件*.CC语言的源程序*.OBJ目标文件*.EXE可执行文件如显示器、打印机、键盘等设备文件:是指与主机相联的各种外部设备。(键盘、显示器、打印机等)普通文件:保存在磁盘或其它外部介质上的文件。(磁盘、磁带等)标准输出文件标准输入文件文件分类:从用户的角度看,文件可分为普通文件和设备文件两种。10.1文件概念文件分类文本文件:ASCII文件,每个字节存放一个字符的ASCII码从文件编码的方式来看,文件可分为文本文件和二进制码文件两种。二进制文件:数据按其在内存中的存储形式原样存放例如将整数1949分别存储在这两种数据文件中。00110001001110010011010000111001'1''9''4''9'0000011110011101二进制存储形式ASCII存储形式占4个字节,存储量大、速度慢、便于对字符操作占2个字节。存储量小、速度快、便于存放中间结果10.2文件指针程序数据区文件缓冲区外存内存磁盘文件输出输入输出输入系统对缓冲文件的处理10.2.1文件缓冲区:系统对文件的处理过程就是对文件进行输入/输出操作的过程。系统处理方法是在内存中为每个正在使用的缓冲文件开辟一个缓冲区,其大小是512个字节。对文件读写数据都通过缓冲区进行。10.2.2文件指针在缓冲文件系统中,对每个正在使用的文件都自动分配一个FILE类型的结构体变量,用于存放文件的有关信息,如文件号、文件状态、缓冲区地址和大小等。在C语言中,无论对磁盘文件还是设备文件的读/写都要通过FILE类型的结构体变量进行。因此对于每个使用中的磁盘文件必须先定义一个FILE类型的文件指针变量并指向此变量。FILE*文件指针变量名;FILE类型是系统定义的,包含在stdio.h头文件中例如:FILE*fp;表示fp是指向FILE结构的指针变量,通常程序中用到几个文件就要用到几个指针变量,分别指向不同的文件。10.3文件打开和关闭函数文件使用方式:打开文件--文件读/写--关闭文件打开文件,实际上是在内存建立文件缓冲区,包括文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。系统自动打开和关闭三个标准文件:标准输入------键盘stdin标准输出------显示器stdout标准出错输出-----显示器stderr关闭文件:断开指针与文件之间的联系,释放缓冲区。10.3.1文件的打开(fopen函数)调用的一般形式为:文件指针名=fopen(文件名,使用文件方式);例如:FILE*fp;fp=fopen(filea,r);又如:FILE*fp1fp1=fopen(c:\\file1,rb)打开C驱动器磁盘的根目录下的文件file1,只允许按二进制方式进行读操作,并使fp1指向该文件。在当前目录下打开文件filea,只允许进行“读”操作,并使fp指向该文件。两个反斜线“\\”中的第一个表示转义字符,第二个表示根目录。必须是被说明为FILE类型的指针变量被打开文件的文件名字符串常量或字符串数组若文件打开成功,为该文件分配一个文件缓冲区和一个FILE类型变量,返回一个FILE类型指针;若文件打开失败,返回NULL。10.3.1文件的打开(fopen函数)文本文件的三种基本使用方式”r”:只读方式为读(输入)文本文件打开文件。若文件不存在,返回NULL。”w”:只写方式为写(输出)文本文件打开文件。若文件不存在,则建立一个新文件;若文件已存在,则清空文件。”a”:追加方式为写(输出)文本文件打开文件。若文件已存在,则保持原来文件的内容,将新的数据增加到原来数据的后面;若文件不存在,则返回NULL。文件使用方式由下列六个字符拼成↓↓↓↓↓↓读写追加文本文件二进制文件读写rwatb+•文件的其他打开方式”r+”:可以对文本文件进行读/写操作。若文件不存在返回NULL;若文件存在内容不被清空。”w+”:可以对文本文件进行读/写操作。若文件已经存在,则先清空文件原来的内容。”a+”:可以对文本文件进行读/追加操作。文件内容不会清空。”rb+”:可以对二进制文件进行读/写操作。”wb+”:可以对二进制文件进行读/写操作。”ab+”:可以对二进制文件进行读/追加操作。10.3.1文件的打开(fopen函数)↓↓↓↓↓↓读写追加文本文件二进制文件读写rwatb+文件使用方式意义“rt”或“r”只读打开一个文本文件,只允许读数据“wt”或“w”只写打开或建立一个文本文件,只允许写数据“at”或“a”追加打开一个文本文件,并在文件末尾写数据“rb”只读打开一个二进制文件,只允许读数据“wb”只写打开或建立一个二进制文件,只允许写数据“ab”追加打开一个二进制文件,并在文件末尾写数据“r+”读写打开一个文本文件,允许读和写“w+”读写打开或建立一个文本文件,允许读写“a+”读写打开一个文本文件,允许读,或在文件末追加数据“rb+”读写打开一个二进制文件,允许读和写“wb+”读写打开或建立一个二进制文件,允许读和写“ab+”读写打开一个二进制文件,允许读,或在文件末追加数据使用文件的方式共有12种,下面给出了它们的符号和意义。10.3.1文件的打开(fopen函数)检查文件打开操作是否成功例:if((fp=fopen(c:\\file1,rb)==NULL){printf(\nerroronopenc:\\file1!);getchar();exit(1);}•如果返回的指针为空(NULL),表示打开C盘根目录下的file1文件失败;•下一行getchar(),在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。•标准库函数exit(),作为出错处理后的出口和执行程序的终止。10.3.1文件的打开(fopen函数)10.3.2文件关闭函数(fclose函数)文件一旦使用完毕,应用关闭文件函数把文件关闭。切断打开的文件指针与文件名的联系,释放文件指针,以避免文件的数据的误操作。fclose函数调用的一般形式是:fclose(文件指针);其中fp是已经打开的文件指针。例如:fclose(fp);作用是关闭fp指定的文件,释放该文件的缓冲区、FILE类型变量及文件指针。注意:当文件不使用时应立即关闭,释放空间供别的文件使用。原因:每个操作系统对一个程序能打开的文件数是有限的。fclose函数返回值为0,表明文件关闭成功,如返回非零值则表示文件关闭失败。10.4常用文件操作函数常用的文件操作函数有:字符读写函数:fgetc和fputc字符串读写函数:fgets和fputs数据块读写函数:fread和fwrite格式化读写函数:fscanf和fprinf都要求包含头文件stdio.h。10.4.1字符读写函数fgetc和fputc字符读写函数是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。1、读字符函数fgetcfgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:字符变量=fgetc(文件指针);例如:ch=fgetc(fp);文件指针变量字符变量若输入操作成功,函数返回读入的字符;若文件结束或输入操作失败,则返回EOF.注意:文件必须是以读或读写方式打开的2、写字符函数fputcfputc函数的功能是把一个字符写入指定的文件中,函数调用的形式为:fputc(字符量,文件指针);如写入成功则返回写入的字符,否则返回一个EOF。待写入的字符量可以是字符常量或变量,例如:fputc('a',fp);其意义是把字符常量a写入fp所指向的文件中。说明:被写入的文件可以用写、读写、追加方式打开用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。例10.1写一个程序,读名字叫text.c源文件,原程序显示到屏幕上10.4.1字符读写函数fgetc和fputc#includestdio.hmain(){FILE*fp;inti;charch;fp=fopen(c:\\tc\\c\\text.c,r);printf(\n);if(fp==NULL){printf(openerr);getchar();exit(1);}ch=fgetc(fp);while(ch!=EOF){printf(%c,ch);ch=fgetc(fp);}fclose(fp);}main(){printf(Howareyou”);}分析:功能是从文件中逐个读取字符,在屏幕上显示定义了文件指针fp以读文本文件方式打开文件读出一个字符,然后进入循环读出一个字符,然后进入循环打开文件出错,给出提示并退出程序例10.2把命令行中指出的两个文件连接起来输出到指定的新文件中。10.4.1字符读写函数fgetc和fputc#includestdio.hmain(intargc,char*argv[]){FILE*fp1,*fp2,*fp3;inti;charch;if(argc4){printf(notice:youshouldentermorefilename!\n);exit(0);}if((fp1=fopen(argv[1],r))==NULL){printf(cannotopensourcefile1\n);exit(0);}if((fp2=fopen(argv[2],r))==NULL){printf(cannotopensourcefile2\n);exit(0);}if((fp3=fopen(argv[3],w))==NULL){printf(cannotopenfile3);exit(0);}do{ch=fgetc(fp1);fputc(ch,fp3while(ch!=EOF);do{ch=fgetc(fp2);fputc(ch,fp3while(ch!=EOF);fclose(fp1);fclose(fp2);fclose(fp3);}从file1读一个字符,写到file3中去从file1读一个字符,写到file3中去命令行4个参数本程序执行文件名是cat.exe.在DOS命令提示符下输入:C:〉catfile1file2newfile↙10.4.2字符串读写函数fgets和fputs1.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:fgets(字符数组名,n,文件指针);。例如:fgets(str,n,fp);其意义是从fp所指的文件中读出n-1个字符送入字符数组str中。其中的n是一个正整数。表示从文件中读出的字符串不超过n-1个字符。在读入的最后一个字符后加上串结束标志'\0'对fgets函数有两点说明:在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。fgets函数也有返回值,其返回值是字符数组的首地址。例10.3从text.c文件中读入一个含5个字符的字符串。10.4.2字符串读写函数fgets和fputs1.读字符串函数fgets#includestdio.hmain(){FILE*fp;charstr[6];if((fp=fopen(c:\\tc\\c\\text.c,r))==NULL){printf(\nCannotopenfilestrikeanykeyexit!);getch();exit(1);}fgets(str,6,fp);prin