,1,*,*,C,语言电子教案(十九),第十九讲 第十三章 文件,主要内容:,13.1,文件的概念,13.2,文件类型的指针,13.3,文件的打开和关闭,13.4,文件的读写,13.5,文件的定位,C语言电子教案(十九)第十九讲 第十三章 文件,13.1,文件的概念,文件的创建方式:(,1,)通过文字处理软件或操作系统的文件管理功能;(,2,)通过程序语句创建。,数据的输入和输出:在计算机中,数据的输入和输出都是,相对于主机,(即内存)而言。将数据从磁盘文件或输入设备读入内存称为输入,从内存写到磁盘文件或输出设备称为输出。,13.1 文件的概念文件的创建方式:(1)通过文字处理软,一、文件的概念,文件,:存储在外部介质,(,如,:,软盘、硬盘、光盘等,),上的数据的集合。,操作系统都是以文件为单位对数据进行管理的,文件又是以文件名作为标识符。,在程序设计中,有时需要将磁盘上的数据读入内存中,有时需要将内存中的数据写入磁盘中,这就要用到文件。如:我们可以将一个班的学生的考试成绩写入数据文件,这样在程序设计中,多个用户都可以使用这样的数据文件,而不必多次输入造成重复劳动。,一、文件的概念文件:存储在外部介质(如:软盘、硬盘、光盘等),二、文件的组织形式,文件可分为,ASCII,码文件,和,二进制文件,。,ASCII,文件,:又称为文本文件,(.txt),文件,其中每个字节存放一个,ASCII,码字符。,ASCII,码文件占存储空间大,且要花费时间转换,(,要进行二进制形式与,ASCII,码形式之间的转换,),二进制文件,:是将内存中的数据按在内存中的存储形式原样输出到磁盘上存放。二进制文件节省存储空间,不需要转换,但不能直接输出字符形式,也就是说,不能直观地显示文件的内容,二、文件的组织形式文件可分为ASCII码文件和二进制文件。,二、文件的组织形式,如:整数,1000,在,ASCII,文件中,:按照,4,个字符(,1,0,0,0,)存储,占,4,个字节。分别为:,00110001 00110000 00110000 00110000,1000=512+256+128+64+32+0+8+0+0+0,=,(,00000011 11101000,),2,1,的,ASCII,码值为,49=32+16+0+0+0+1,在二进制文件中,:是按数据在内存中的存储形式(即按补码)存储的,占,2,个字节,分别为:,00000011 11101000,二、文件的组织形式如:整数10001000=512+256+,13.2,指向文件的指针,指向文件的指针的定义:,FILE*,变量名,;,如:,FILE*,fp;,则定义了指针变量,fp,是一个指向文件的指针。,注意:使用,FILE,定义指向文件的指针时,必须包含头文件,stdio.h,13.2 指向文件的指针指向文件的指针的定义:FILE,13.3,文件的打开和关闭,文件在使用之前,应当先打开,使用之后应将文件关闭,以防数据被破坏。,文件的打开和关闭是使用系统定义的函数来实现的。打开文件的函数是:,fopen(),函数;关闭文件的函数是:,fclose(),函数。,13.3 文件的打开和关闭文件在使用之前,应当先打开,使用,一、文件的打开,方法:,FILE *fp;fp=fopen(,文件名,打开方式),;,文件的打开方式:,r:,文本文件,只读,w:,文本文件,只写,a:,文本文件,追加,rb:,二进制文件的只读,r+:,二进制文件可读可写,打开文件并使指针,指向文件首,打开文件并使指针,指向文件首,打开文件并使指针,指向文件尾,一、文件的打开方法:文件的打开方式:打开文件并使指针指向文件,一、文件的打开,例如:,FILE *fp;fp=fopen(E:test.dat,,,w,),;,表示将,E,盘根目录下的,test.dat,文件,按只写的方式打开。如果磁盘上有此文件,打开并将文件指针指向文件首;如果磁盘上无此文件,创建一个新文件并打开。,文件的打开的常用格式:,if(fp=fopen(aa,r)=NULL)printf(cannot open this filen);exit(0);,一、文件的打开例如:文件的打开的常用格式:if(fp=f,二、文件的关闭,方法:,fclose(,文件指针),;,例如:,fclose(fp);,将指针,fp,指向的文件关闭。所谓文件关闭就是文件指针与文件的指向关系中断。,二、文件的关闭方法:,13.4,文件的读写,打开文件后,可对文件进行读写操作,对文件的读写操作包括以下几种,:fgetc(),函数:将一个字符由磁盘文件中读入到内存,fputc(),函数:将一个字符写入磁盘文件,fread(),函数:将一组数据由磁盘文件读入到内存,fwrite(),函数:将一组数据写入磁盘文件,fscanf(),函数:将一组数据由磁盘文件中读入到内存,fprintf(),函数:将一个数据写入磁盘文件,13.4 文件的读写打开文件后,可对文件进行读写操作,对文,13.4,文件的读写,由于,CPU,只能与内存有直接数据交换,因此读出文件中的数据不能直接从文件到屏幕,而文件的写入操作也不能直接由键盘到文件,必须经过内存才能进行。,文件的读入操作一般包括:先从文件读入到内存再从内存中将数据显示到屏幕。,文件的写入操作一般包括:先从键盘输入到内存再从内存写入到文件,13.4 文件的读写由于CPU只能与内存有直接数据交换,因,一、,fgetc(getc),函数,磁盘文件字符输入函数,调用格式,:fgetc(fp);,功能,:,从,fp,所指定的文件中读入一个字符到内存。,返回值,:,如果输入成功,返回所读入的字符,;,若输入不成功,则返回,EOF(-1),一、fgetc(getc)函数磁盘文件字符输入函数调用格式,二、,fputc(putc),函数,磁盘文件字符输出函数,调用格式,:fputc(ch,fp);,功能,:,将字符,ch,写入,fp,所指定的数据文件中。,返回值,:,如果输入成功,返回所写入的字符,;,若输入不成功,则返回,EOF(-1);,二、fputc(putc)函数磁盘文件字符输出函数调用格式,例,1,从键盘上输入一行字符写入,data1.dat,中,遇,#,结束,#include stdio.h,main(),FILE*fp;,fp=fopen(data1.dat,w);,ch=getchar();,while(ch!=#),fputc(ch,fp);,putchar(ch);,ch=getchar();,fclose(fp);,定义指向文件的指针,打开文件,使,fp,指向文件,从键盘到读入到内存,从内存写入文件,输出到屏幕让用户观察,从键盘到内存,为下次循环准备,关闭文件,if(fp=fopen(data1.txt,w)=NULL),printf(cannot open this filen);exit(0);,运行程序,例1 从键盘上输入一行字符写入data1.dat中,遇#结束,三、,fread(),函数,磁盘文件输入函数,调用格式,:fread(p,size,n,fp);,功能,:,从,fp,指定的文件中,读出连续,n,个大小为,size,的数据项,将这些数据项读到以,p,为起始地址的内存地址中。,返回值,:,从,fp,所指向的文件中读出的数据个数。,文件类型:二进制文件,三、fread()函数磁盘文件输入函数调用格式:fr,四、,fwrite(),函数,磁盘文件输出函数,调用格式,:fwrite(p,size,n,fp);,功能,:,将,p,所指定的内存地址作为起始地址,将连续,n,个大小为,size,的数据项写入,fp,所指定的磁盘文件中。,返回值,:,写入,fp,所指向的文件中的,数据个数,。,文件类型:二进制文件,四、fwrite()函数磁盘文件输出函数调用格式:f,五、,fscanf(),函数,磁盘文件输入函数,调用格式,:fscanf(fp,格式字符串,地址表列,);,功能,:,按格式字符串所指定的格式,将从,fp,所指定的文件中读入的数据写入的内存单元地址中,每输入一个数据,指针向下移动若干字节。,文件类型:,ASCII,码文件,五、fscanf()函数磁盘文件输入函数调用格式:f,六、,fprintf(),函数,磁盘文件输出函数,调用格式,:fprintf(fp,格式字符串,输出项表,);,功能,:,按格式字符串指定的格式,向,fp,所指定的文件中写入数据,每写入一个数据,文件指针向下移动若干字节。,文件类型:,ASCII,码文件,六、fprintf()函数磁盘文件输出函数调用格式:,13.5,文件的定位,文件中都有一个指针,指向当前的读写位置,文件每进行一次读写操作,文件指针就会自动指向下一个位置。,如果想改变这种规律,就需要强制地使文件指针指向特定的位置,需要使用相应的函数来实现。,13.5 文件的定位文件中都有一个指针,指向当前的读写位置,一、,rewind(),函数,调用格式,:rewind(fp),功能,:,使,fp,所指向的文件指针重新返回文件的开头。,返回值:无,一、rewind()函数 调用格式:rewind(fp,二、,ftell(),函数,调用格式,:ftell(fp),功能,:,返回,fp,所指向的文件指针的当前位置。,返回值:长整型,其值是文件指针相对于文件头的字节数。,二、ftell()函数 调用格式:ftell(fp),例,2,从键盘上输入,10,个整数写入,data2.dat,中并输出,#include stdio.h,main(),FILE*fp;,int i,j,k;,int a10,b10;,fp=fopen(data2.dat,w+);,for(i=0;i10;i+)scanf(%d,fwrite(a+i,sizeof(int),1,fp);,for(i=0;i10;i+)fread(b+i,sizeof(int),1,fp);printf(%6d,bi);,printf(n);,fclose(fp);,定义指向文件的指针,打开文件,使,fp,指向文件,从键盘到读入到内存,从内存写入文件,从文件到内存,从内存到屏幕,让用户观察,关闭文件,运行程序,rewind(fp);,例2 从键盘上输入10个整数写入data2.dat中并输出#,例,3,从键盘上输入,10,个整数写入,data3.dat,中并输出,#include stdio.h,main(),FILE*fp;,int i,j,k;,int a10,b10;,fp=fopen(data2.dat,w+);,for(i=0;i10;i+)scanf(%d,for(i=0;i10;i+)fscanf(fp,%d,b+i);printf(%6d,*(b+i);,printf(n);,fclose(fp);,定义指向文件的指针,打开文件,使,fp,指向文件,从键盘到读入到内存,从内存写入文件,从文件到内存,从内存到屏幕,让用户观察,关闭文件,运行程序,rewind(fp);,例3 从键盘上输入10个整数写入data3.dat中并输出#,例,4,将文件,file1.c,中的内容显示在屏幕上并写入文件,file2.c,中,#include“stdio.h”,main(),FILE*fp1,*fp2;,fp1=fopen(“file1.c”,“r”);,fp2=fopen(“file2.c”,“w”);,while(!feof(fp1),putchar(getc(fp1);,rewind(fp1);,while(!feof(fp1),putc(getc(fp1),fp2);,fclose(fp1);,fclose(fp2);,从,fp1,所指文件读出字符并显示在屏幕上,使,fp1,指向文件,从,fp1,所指文件读出字符并现写入,fp2,所指文件,运行程序,例4 将文件file1.c中的内容显示在屏幕上并写入文件fi,