第9章信息学院计算机基础组文件1.文件的存储形式2.文件的操作(打开,关闭,读出,写入,定位等)本章主要内容:9.1文件概述数据以内存储器为依托的内存数据以计算机外存储器为依托的外存数据(该类数据存储在外部介质中)9.1文件概述9.1.1文件的概念文件是存储在外部介质上的信息的集合.形式:数据、程序,图形、图像、声音等。文件分类:文本文件:每一个字节存放一个ASCII码,代表一个字符,具有可读性。二进制文件:数据按其在内存中的存储形式保存在外部介质中。9.1文件概述9.1.2缓冲文件系统在程序数据区和文件数据之间建立了内存缓冲区,程序与文件数据之间的交换通过缓冲区来实现。程序数据区文件缓冲区文件图9-1内存和外部文件之间数据交换过程9.1文件概述9.1.3文件结构和文件类型指针FILE结构类型:是使用typedef在stdio.h头文件中定义的一种结构类型,给出了文件的相关信息(文件名、文件状态、文件缓冲区的首地址等)。文件类型的指针变量格式为:FILE*文件指针名例如:FILE*fp;9.2文件的打开和关闭文件操作一般遵循以下步骤:创建/打开文件。从文件中读取数据或向文件中写入数据。关闭文件。9.2文件的打开和关闭9.2.1文件打开函数fopenfopen()的一般调用形式为:FILE*fpfp=fopen(文件名,文件操作方式);功能:按照指定的方式打开/创建指定的文件。返回值:打开/创建文件成功时返回与文件相对应的结构体类型的指针,否则返回空(NULL)。9.2文件的打开和关闭例如:if((fp=fopen(student.txt,r))==NULL){printf(cannotopenthefile);exit(0);}9.2.1文件打开函数fopen文件名是由双引号扩起来的实际文件名文件操作方式:r(只读);系统标准函数,作用是关闭所有打开的文件,并终止程序的执行表9-1文件操作方式文本文件操作方式二进制文件操作方式含义r以只读方式打开一个文本文件w以只写方式打开/创建一个文本文件a以追加的方式打开/创建一个文本文件,在文件末尾添加数据r+以读写方式打开一个文本文件w+以读写方式创建一个文本文件a+以读写方式打开/创建一个文本文件rb以只读方式打开一个二进制文件wb以只写方式打开一个二进制文件ab以追加的方式打开/创建一个二进制文件,在文件末尾添加数据rb+以读写方式打开一个二进制文件wb+以读写方式创建一个二进制文件ab+以读写方式打开/创建一个二进制文件9.2文件的打开和关闭9.2.2文件关闭函数fclosefclose()函数调用的一般形式:fclose(fp);/*该文件指针指向要关闭的文件,在打开文件时已赋值。*/功能:关闭fp指向的文件。释放文件占用的内存空间。返回值:正常关闭了文件,返回值为0,文件关闭不成功,返回值为EOF(EOF在stdio.h文件中被定义为符号常量,其值为-1)。9.3文件的读写判断文件是否结束的两种方法特殊符号常量EOFEOF(-1)可以作为文本文件的结束标志,不能作为二进制文件结束标志。标准库函数feof()函数判断文件是否结束,既可用于文本文件,也可以用于二进制文件。feof()函数调用的一般形式为:feof(fp);/*fp是指向一个打开文件的文件指针*/函数返回1表示文件已经结束,返回0表示文件未结束。9.3文件的读写9.3.1文件的字符输入输出函数文件的字符输入函数fgetc()其调用的一般形式为:c=fgetc(fp);功能:从fp指向的文件中读取一个字符,送给字符变量c。执行成功返回读取的字符的ASCII码,遇到文件结束或在执行中出错时返回值为EOF。文件的字符输出函数fputc()其调用的一般形式为:fputc(c,fp);功能:将字符变量c代表的字符写入到fp所指向的文件。执行成功时返回写入文件的字符值(ASCII码),函数fputc()执行错误时返回EOF。9.3文件的读写9.3.1文件的字符输入输出函数例9-1从f_src.txt文件将数据逐个读出,将其中的数字删除后写入到文件f_dst.txt中。程序代码如下:#includestdio.h#includestdlib.hvoidmain(){charc;FILE*fp1,*fp2;if((fp1=fopen(f_src.txt,r))==NULL)/*以只读方式打开f_src.txt文件*/{printf(cannotopenthefile.\n);exit(0);/*终止程序*/}9.3文件的读写if((fp2=fopen(f_dst.txt,w))==NULL){printf(cannotopenthefile.\n);exit(0);/*终止程序*/}while(!feof(fp1))/*判断f_src.txt文件是否到结尾处*/{c=fgetc(fp1);/*从fp1指向的文件读取一个字符*/if(!(c='0'&&c='9'))fputc(c,fp2);/*非数字字符写入fp2指向的文件*/printf(%c,c);}fclose(fp1);fclose(fp2);}9.3.1文件的字符输入输出函数9.3文件的读写9.3.2文件的字符串输入输出函数文件的字符串输入函数fgets()其调用的一般形式为:fgets(str,n,fp);功能:从fp指向的文件中读取n-1个字符,加字符串结束标志后送字符数组str或字符指针变量str指定的内存空间。返回值:函数执行成功,返回读取的字符串(首地址);函数执行出错或遇到文件结束时返回NULL。9.3文件的读写9.3.2文件的字符串输入输出函数文件字符串输出函数fputs()其调用的一般形式为:fputs(str,fp);功能:将str(可以时字符串常量,字符数组名,字符指针变量)代表的字符串写入到fp所指向的文件。返回值:函数执行成功,返回写入文件中的字符个数;函数执行出错或遇到文件结束时返回EOF。9.3文件的读写例9-2从键盘上输入若干行字符串并将它们存放到指定的文件string.txt中,仅输入一个回车时结束输入过程。程序代码如下:#includestdio.h#includestdlib.h#includestring.hvoidmain(){FILE*fp;charstr[30];if((fp=fopen(string.txt,w))==NULL){printf(cannotopenthefile.\n);exit(0);}9.3.2文件的字符串输入输出函数9.3文件的读写printf(Pleaseinputstrings:\n);while(strlen(gets(str))0)/*输入的字符串非空*/{fputs(str,fp);/*将字符串写入fp指向的文件*/fputc('\n',fp);/*将换行写入fp指向的文件*/}fclose(fp);}9.3.2文件的字符串输入输出函数9.3文件的读写9.3.3文件的格式化输入输出函数文件的格式化输入函数fscanf()fscanf()函数调用的一般形式为:fscanf(文件指针,格式字符串,输出列表);功能:按照指定格式读取文本文件中的数据。例如:fscanf(fp,%d%f%c,i,s,ch);其中fp指向一个已经打开的文件,从该文件中读入整型数据到变量i,读入浮点型数据到变量s,读入字符数据到变量ch。9.3文件的读写文件的格式化输出函数fprintf()fprintf()函数调用的一般形式为:fprintf(文件指针,格式字符串,输入列表);功能:将给定的数据按照指定格式写入文件。例如:fprintf(fp,%d%.2f%c,i,f,ch);其中fp指向一个已经打开的文件,将变量i,f和ch的值按照整型格式,浮点型格式(保留2位小数)和字符型格式输出到fp指向的文件。9.3.3文件的格式化输入输出函数9.3文件的读写9.3.3文件的格式化输入输出函数例9-3在student.txt文件中存放了20个学生的成绩,计算20个学生的平均成绩后存放到stu_average.txt文件中。#includestdio.h#includestdlib.h#defineN20voidmain(){floataverage(int*p,intnum);inti,score[N];FILE*fp;floataver;if((fp=fopen(student.txt,r))==NULL){printf(Cannotopenthegivenfile.\n);exit(0);}9.3文件的读写for(i=0;iN;i++)fscanf(fp,%d,,&score[i]);/*从指定的文件按照指定格式读入数据*/fclose(fp);aver=average(score,N);/*求平均值*/if((fp=fopen(stu_aver.txt,w))==NULL){printf(cannotopenfile.\n);exit(0);}fprintf(fp,%.1f,aver);/*将平均值写入指定文件*/fclose(fp);}9.3.3文件的格式化输入输出函数9.3文件的读写floataverage(int*p,intnum)/*求平均值函数*/{inti,sum;floataver;sum=0;for(i=0;inum-1;i++)sum+=*(p+i);aver=sum*1.0/num;returnaver;}9.3.3文件的格式化输入输出函数9.3文件的读写9.3.4文件的数据块输入输出函数文件的数据块输入函数fread()其调用的一般形式为:fread(buffer,size,count,fp);功能:从指定的文件中按指定长度读取一个数据块到内存的指定区域;buffer:指针变量,它表示读出数据在内存中存放的起始地址;size:一个数据项的字节长度;count:要读取的数据项个数;fp:指向一个已经打开的待读文件。返回值:函数执行正确时,为从文件中读取的数据项数,函数执行出现错误时返回值小于指定读取的数据项数。例如:fread(a,2,10,fp);9.3文件的读写9.3.4文件的数据块输入输出函数文件的数据块输出函数fwrite()其调用的一般形式为:fwrite(buffer,size,count,fp);buffer:指针变量,表示要写入文件的数据块在内存中的起始地址;size:一个数据项的字节长度;count:要写入的数据项个数;fp指向一个已经打开的文件。返回值:函数执行正确时,为写入文件的数据项数;函数执行出现错误时返回值小于指定读取的数据项数。9.3文件的读写9.3.4文件的数据块输入输出函数例9-4从键盘上输入3条通讯录记录(每条记录包括姓名和电话号码两项),写入文件tel.txt中,再读出这些数据显示在屏幕上。程序代码如下:#includestdio.h#includestdlib.h#defineN3structperson{charname[10];longintno;};voidmain(){structpersonper[N],*p;FILE*fp;inti;p=per;9.3文件的读写if((fp=fopen(tel.txt,w))==NULL){printf(cannotopenthefile.\n);exit(0);}printf(Inputdata:\n);for(i=0;iN;i++,p++)scanf(%s%ld,p-name,&p-no);/*输入记录*/fwrite(per,sizeof(structperson),N,fp);/*将输入的记录写入指定文件*/rewind(fp);/*将文件内部记录指针移动到文件头部*/p=per;fread(p,sizeof(structperson),N,fp);/*读取记录*/for(i=0;iN;i++,p++)print