第12章文件操作2第12章:文件学习的意义C语言执行程序输入数据输出数据100200300存在问题:运行完毕,结果消失!运行结果能否长期保存呢?使用文件!如:C语言源程序文件(.c或.cpp)、执行文件(.exe)、图片文件(.jpg)……3学习目标理解文件的概念正确把握文本文件与二进制文件的区别;掌握文件的打开、读写、定位以及关闭的方法;掌握文件系统中有关文件操作的系统函数使用方法;能设计对文件进行简单处理的实用程序;412.1文件的基本概念内存硬盘大量的数据保存到文件实现永久存储保存在变量和数组中的数据是暂时的写读文件存储在外存储器上的数据集合。512.1文件的基本概念数据的层次结构001000111001001111010110011011100100100100111101101011101001011WangHai21M788983LiFei21F768885ZhaoXin21M818679010111001…………………………文件字段字节位记录612.1文件的基本概念C语言的文件处理C语言把文件看作是一个有序的字节或字符流。712.1文件的基本概念文件的分类(按存储形式分)文本文件数据被作为字符,并以字符的二进制编码形式保存。举例二进制文件以数据在内存中的二进制形式保存。举例1234整数0000010011010010把1234的二进制编码写入文件中1234‘1’‘2’‘3’‘4’整数把4个字符的二进制编码写入文件中00110001001100100011001100110100文件的分类(按存储形式分)文本文件数据被作为字符,并以字符的二进制编码形式保存。举例812.1文件的基本概念文件的读写缓冲文件系统系统在内存中开辟一块缓冲区以便慢速的外设与其成块地进行数据交换。向磁盘(文件)输出数据:–数据→缓冲区,装满缓冲区后→磁盘文件。从磁盘(文件)读入数据:–先一次性从磁盘文件将一批数据输入到缓冲区,–然后再从缓冲区逐个数据读入到变量。912.2文件指针文件指针(指向文件的指针)缓冲文件系统为每个使用的文件在内存中开辟一存储区存放其相关信息,这些信息用一个结构体变量保存,该结构体类型的名字是FILE。程序通过FILE类型指针建立和文件的联系,进行关于文件的一切操作。定义形式:FILE*指针变量名;举例:定义了一个结构体FILE类型的指针变量:fp。用于存放文件的缓冲区首地址,即指向一个文件。FILE*fp;1012.3文件的打开打开文件方法:为了打开一个文件,首先要为该文件定义一个文件类型指针;然后用C语言提供的fopen()函数打开文件。fopen函数有两个参数:–“文件名”与“文件使用方式”。–它们均是字符串。一般形式:FILE*文件指针名;…文件指针名=fopen(文件名,文件使用方式);1112.3文件的打开打开文件文件使用方式符号意义r(read)以只读方式打开一个文本文件,若文件不存在,则返回空指针w(write)以只写方式打开或创建一个文本文件,并覆盖原有数据a(append)以追加方式打开或创建一个文本文件,并从文件末尾写数据t(text)文本文件,可省略不写b(binary)二进制文件+读和写1212.3文件的打开打开文件举例其意义是在当前目录下打开文件filea.dat,文件的使用方式为“只读”,并使fp指向该文件。举例其意义是打开c盘根目录下的文件fileabc.dat,这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\”中的第一个表示转义字符,第二个表示根目录。FILE*fp;fp=fopen(filea.dat,r);FILE*fpabc;fpabc=fopen(“c:\\fileabc.dat,rb);1312.3文件的关闭关闭文件使用fclose()函数。一般形式:fclose(文件指针);举例将fp指向的缓冲区中的数据存放到外存储器的文件中,然后释放该缓冲区,使文件指针变量不再指向与该文件对应的FILE结构,从而断开与文件的关联。操作正常返回0,否则返回EOF(是在stdio.h文件中定义的符号常量,值为-1)。FILE*fp;…fclose(fp);如果不关闭文件,将会丢失数据,并且一个C程序能同时打开的文件数有限,应该养成在使用完文件后关闭文件的习惯。14使用文件的一般步骤:1、声明文件指针FILE*fp;2、打开文件fp=fopen(“文件名”,“打开方式”);3、判断是否打开文件if(fp==NULL){/*当文件打开失败时的处理*/}4、读/写文件fscanf(fp,输入格式,输入列表);fprintf(fp,输出格式,输出列表);fgetc(fp)/fputc(ch,fp);fgets(str,n,fp)/fputs(str,fp);fread()/fwrite(ptr,size,n,fp);5、关闭文件fclose(fp);小结:r、w、ar+、w+、a+rb、wb、ab15FILE*fp;fp=fopen(wang.txt,r+);if(fp==NULL){printf(thefile:wang.txtnotfound!);exit(-1);}……//读取和加工数据fclose(fp);//关闭该文件小结:例:1612.4文件的读写C语言支持两种读写文件的方式顺序读写从文件中一个接一个地读写数据,仅当读写了前一个数据后,才能读写下一个数据。在读写数据后,文件位置指针自动跳到下一个读写位置。标准输入输出只能进行顺序读写。随机读写从文件中读写数据时可不考虑数据在文件中的位置,可以在文件的任何位置读写。在读写数据前,需要将文件位置指针移到读写位置。当文件以读或写方式打开,文件位置指针设置在文件头,若文件以附加方式打开,位置设置在文件末尾。1712.4文件的读写在C语言中提供了多种文件读写的函数,这些函数主要包括:格式化读写函数:fscanf和fprintf字符读写函数:fgetc和fputc字符串读写函数:fgets和fputs数据块读写函数:fread和fwrite18(1)格式化读写格式化读fscanf()函数fscanf(文件指针,”格式控制字符串”,地址表列);从指定的文件中格式化读数据。这个函数与格式输入函数scanf()很相似,它们的区别在于,scanf()函数是从键盘输入数据,而fscanf()函数是从文件读入数据,因此在fscanf()函数参数中多了一个文件指针,用于指出从哪个文件读入数据。举例–表示从磁盘文件中的读取一个浮点数和一个整数,分别存入变量f和d。fscanf(fp,“%f%d”,&f,&d);19(1)格式化读写格式化写fprintf()函数fprintf(文件指针,”格式控制字符串”,输出表列);格式化写数据到指定的文件中。这个函数与printf()函数很相似,它们的区别在于,printf()函数是将数据输出到屏幕上,而fprintf()函数是将数据输出到文件中,因此在fprintf()函数参数中多了一个文件指针,用于指出将数据输出到哪个文件中。举例–表示把变量f和d按指定的格式写入磁盘文件。fprintf(fp,“f=%f,d=%d\n”,f,d);20格式化读写案例#includestdio.hintmain(){FILE*fp;inta,b;floatx,y;fp=fopen(data.txt,w);scanf(%d%f,&a,&x);fprintf(fp,%d,%6.2f,a,x);//将i和t按%d,%6.2f格式输出到fp文件fclose(fp);fp=fopen(data.txt,r);fscanf(fp,“%d,%f”,&b,&y);//把文件data.txt中的数据送入b,和yfclose(fp);printf(a=%dx=%6.4f,a,x);printf(b=%dy=%6.4f,b,y);return0;}kj12p15.c21格式化读写案例#includestdio.hintmain(){FILE*fp;inti,j,a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},b[5][3];fp=fopen(kj12p17.txt,w);for(i=0;i5;i++){for(j=0;j3;j++)fprintf(fp,%d,a[i][j]);fprintf(fp,\n);}fclose(fp);fp=fopen(kj12p17.txt,r);for(i=0;i5;i++)for(j=0;j3;j++)fscanf(fp,%d,&b[i][j]);fclose(fp);}for(i=0;i5;i++){for(j=0;j3;j++)printf(%d,b[i][j]);printf(\n);}22使用文件的步骤:1、声明文件指针FILE*fp;2、打开文件fp=fopen(“文件名”,“打开方式”);3、读/写文件fscanf(fp,输入格式,输入列表);fprintf(fp,输出格式,输出列表);fgetc(fp)/fputc(ch,fp);fgets(str,n,fp)/fputs(str,fp);fread()/fwrite(ptr,size,n,fp);4、关闭文件fclose(fp);r、w、ar+、w+、a+小结:23(2)字符读写函数:fgetc和fputcfgetc()函数功能:从filepointer指向的文件中,读入一个字节(字符),同时将读写位置指针向前移动1个字节(即指向下一个字符)返值:正常,返回读到的代码值;读到文件尾或出错,为EOF(其值在头文件stdio.h中被定义为-1)。举例fputc()函数功能:将字符数据c输出到filepointer所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。返值:正常,返回c;出错,为EOF举例ch=fgetc(fp);fputc('a',fp);24#includestdlib.h#includestdio.hintmain(){FILE*fp;charch,*filename=out.txt;if((fp=fopen(filename,w))==NULL){printf(cannotopenfile\n);exit(0);}printf(Pleaseinputstring:);例:从键盘输入字符,逐个存到磁盘文件中,直到输入#为止ch=getchar();while(ch!='#'){fputc(ch,fp);putchar(ch);ch=getchar();}fclose(fp);return0;}Kj12p19.c25#includestdlib.h#includestdio.hintmain(){FILE*fp;charch,*filename=out.txt;if((fp=fopen(filename,r))==NULL){printf(cannotopenfile\n);exit(0);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);return0;}判断文本文件是否结束例3:读文本文件内容,并输出到屏幕上Kj12p20.c方法126判断二进制或ASCII码文件是否结束while(!feof(fp)){c=fgetc(fp);……..}判断文本文件是否结束feof函数原型:intfeof(FILE*fp)功能:判断文件是否结束返值:文件结束,返回真(非0);文件未结束,返回027#includestdlib.h#includestdio.hintmain(){FILE*fp;charch,*filename=“out.txt”;//换成“kj12p20.c”if((fp=fopen(filename,r))==NULL){printf(cannotopenfile\n);exit(0);}//while((ch=fg