第10章-对文件的输入输出_第1页
第10章-对文件的输入输出_第2页
第10章-对文件的输入输出_第3页
第10章-对文件的输入输出_第4页
第10章-对文件的输入输出_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、10.1 文件的有关基本知识文件的有关基本知识10.2 打开与关闭文件打开与关闭文件10.3 顺序读写数据文件顺序读写数据文件10.4 随机读写数据文件随机读写数据文件10.5 文件读写的出错检测文件读写的出错检测10.1.1 什么是文件什么是文件10.1.2 文件名文件名10.1.3 文件的分类文件的分类10.1.4 文件缓冲区文件缓冲区10.1.5 文件类型指针文件类型指针 文件有不同的类型,在程序设计中,主要用到两种文件文件有不同的类型,在程序设计中,主要用到两种文件:(1) 程序文件程序文件。包括。包括源程序文件源程序文件(后缀为后缀为.c)、目标文件目标文件(后缀为后缀为.obj)、

2、可执行文件可执行文件(后缀为后缀为.exe)等。这种等。这种文件的内容是程序代码。文件的内容是程序代码。(2) 数据文件数据文件。文件的内容不是程序,而是供程序运行。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘时读写的数据,如在程序运行过程中输出到磁盘(或其或其他外部设备他外部设备)的数据,或在程序运行过程中供读入的数的数据,或在程序运行过程中供读入的数据。如一批学生的成绩数据,或货物交易的数据等。据。如一批学生的成绩数据,或货物交易的数据等。 本章主要讨论的是本章主要讨论的是数据文件数据文件 文件要有一个唯一的文件标识,以便用户识别和引用。文件要有一个唯一的文

3、件标识,以便用户识别和引用。 文件标识包括三部分:文件标识包括三部分:(1)文件路径文件路径(2)文件名主干文件名主干(3)文件后缀文件后缀例如:例如:D: CCtempfile1.dat 根据数据的组织形式,数据文件可分为根据数据的组织形式,数据文件可分为ASCII文件文件和和二二进制文件进制文件。u数据以二进制形式存储的,就是数据以二进制形式存储的,就是二进制文件二进制文件uASCII文件又称文本文件,每一个字节放一个字符的文件又称文本文件,每一个字节放一个字符的ASCII代码代码 ANSI C标准采用标准采用“缓冲文件系统缓冲文件系统”处理数据文件处理数据文件 所谓所谓缓冲文件系统缓冲文

4、件系统是指系统自动地在内存区为程序中每是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区一个正在使用的文件开辟一个文件缓冲区 从内存向磁盘输出数据必须先送到内存中的缓冲区,装从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去满缓冲区后才一起送到磁盘去 如果从磁盘向计算机读入数据,则一次从磁盘文件将一如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)冲区逐个地将数据送到程序数据区(给程序变量)程序数据区程序数据区输出文

5、件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从内存向磁盘输出数据从内存向磁盘输出数据、从磁盘向计算机读入数从磁盘向计算机读入数据。据。装满缓冲区装满缓冲区充满缓冲区充满缓冲区 缓冲文件系统中,关键的概念是缓冲文件系统中,关键的概念是“文件类型指针文件类型指针”,简称,简称“文件指针文件指针”u每个被使用的文件都在内存中开辟一个相应的文件信息区每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)文件当前位置等)u这些信息是保存在一个结构体变量中的。该结构体类型是这些信息

6、是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为由系统声明的,取名为FILE 声明声明FILE结构体类型的信息包含在头文件结构体类型的信息包含在头文件“stdio.h”中中 一般一般设置一个指向设置一个指向FILE类型变量的指针变量,然后通过它来类型变量的指针变量,然后通过它来引用这些引用这些FILE类型变量类型变量FILE*fp;Turbo C在在stdio.h文件中有以下的文件类型声明:文件中有以下的文件类型声明:typedef struct short level; /*缓冲区缓冲区“满满”或或“空空”的程度的程度*/ unsigned flags; /*文件状态标志文件状

7、态标志*/ char fd; /*文件描述符文件描述符*/ unsigned charhold; /*如无缓冲区不读取字符如无缓冲区不读取字符*/ short bsize; /*缓冲区的大小缓冲区的大小*/ unsignedchar *buffer; /*数据缓冲区的位置数据缓冲区的位置*/ unsignedar *curp; /*指针,当前的指向指针,当前的指向*/ unsigned istemp; /*临时文件,指示器临时文件,指示器*/ short token; /*用于有效性检查用于有效性检查*/FILE; 在缓冲文件系统中在缓冲文件系统中,每个被使用的文件都要在内存中开辟一每个被使用

8、的文件都要在内存中开辟一FILE类型的区类型的区,存放文件的有关信息。存放文件的有关信息。10.2.1 用用fopen函数打开数据文件函数打开数据文件10.2.2 用用fclose函数关闭数据文件函数关闭数据文件 对文件读写之前应该对文件读写之前应该“打开打开”该文件,在使用结束之后该文件,在使用结束之后应应“关闭关闭”该文件。该文件。 所谓所谓“打开打开”是指为文件建立相应的信息区是指为文件建立相应的信息区(用来存放用来存放有关文件的信息有关文件的信息)和文件缓冲区和文件缓冲区(用来暂时存放输入输出用来暂时存放输入输出的数据的数据)。 在编写程序时,在打开文件的同时,一般都指定一个指在编写程

9、序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写的联系,这样就可以通过该指针变量对文件进行读写 所谓所谓“关闭关闭”是指撤销文件信息区和文件缓冲区是指撤销文件信息区和文件缓冲区 fopen函数的调用方式为:函数的调用方式为:fopen(文件名文件名,使用文件方式使用文件方式); 通常将通常将fopen函数的返回值赋给一个函数的返回值赋给一个指向指向FILE类型变量的类型变量的指针变量指针变量。 例如:例如: FILE *fp; fp=fopen(“a1”,”r”

10、);u表示要打开名为表示要打开名为“a1”的文件,使用文件方式为的文件,使用文件方式为“读入读入”ufopen函数的返回值是指向函数的返回值是指向a1文件的指针文件的指针ufp和文件和文件a1相联系,相联系,fp指向了指向了a1文件文件文件使用方式含文件使用方式含 义义 r (只读只读)为为输入输入打开一个打开一个文本文本文件文件w (只写只写)为为输出输出打开一个打开一个文本文本文件文件a (追加追加)向向文本文本文件尾增加数据文件尾增加数据rb (只读只读)为为输入输入打开一个打开一个二进制二进制文件文件wb (只写只写)为为输出输出打开一个打开一个二进制二进制文件文件ab (追加追加)向

11、向二进制二进制文件尾增加数据文件尾增加数据r+ (读写读写)为读为读/写打开一个文本文件写打开一个文本文件w+ (读写读写)为读为读/写建立一个新的文本文件写建立一个新的文本文件a+ (读写读写)为读为读/写打开一个文本文件写打开一个文本文件rb+ (读写读写)为读为读/写打开一个二进制文件写打开一个二进制文件wb+ (读写读写)为读为读/写建立一个新的二进制文件写建立一个新的二进制文件ab+ (读写读写)为读为读/写打开一个二进制文件写打开一个二进制文件 说明:说明:(1) 用用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件方式打开的文件只能用于向计算机输入而不能用作向该文件输出

12、数据,而且该文件应该已经存在,并存有数据,这样程序才能从输出数据,而且该文件应该已经存在,并存有数据,这样程序才能从文件中读数据。文件中读数据。u不能用不能用“r”方式打开一个并不存在的文件,否则出错。方式打开一个并不存在的文件,否则出错。(2) 用用“w”方式打开的文件只能用于向该文件写数据(即输出文件)方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。,而不能用来向计算机输入。u如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命名的文件。名的文件。u如果原来已存在一个以该文件名命名的文件,则在打

13、开文件前先将该如果原来已存在一个以该文件名命名的文件,则在打开文件前先将该文件删去,然后重新建立一个新文件。文件删去,然后重新建立一个新文件。(3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用该用“a”方式打开方式打开u但此时应保证该文件已存在;否则将得到出错信息。但此时应保证该文件已存在;否则将得到出错信息。u打开文件时,文件读写标记移到文件末尾打开文件时,文件读写标记移到文件末尾 说明:说明:(4) 如果打开如果打开失败失败,fopen函数将会带回一个出错信息。函数将会带回一个出错信息。fopen函数将函数将带回

14、一个空指针值带回一个空指针值NULL 常用下面的方法打开一个文件:常用下面的方法打开一个文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”); exit(0); (5) 计算机输从计算机输从ASCII文件读入字符时,遇到回车换行符,系统把文件读入字符时,遇到回车换行符,系统把它转换为一个换行符,在输出时把换行符转换成为回车和换行两个字它转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外

15、部文件中的数据形式完全一致,一一对应。出到外部文件中的数据形式完全一致,一一对应。 关闭文件用关闭文件用fclose函数。函数。 fclose函数调用的一般形式为函数调用的一般形式为:fclose(文件指针文件指针); 例如:例如: fclose (fp); 如果不关闭文件将会如果不关闭文件将会丢失丢失数据。数据。 在顺序写时,先写入的数据存放在文件中前面,后写入在顺序写时,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面的数据存放在文件中后面 在顺序读时,先读文件中前面的数据,后读文件中后面在顺序读时,先读文件中前面的数据,后读文件中后面的数据的数据 对顺序读写来说,对文件读写数据

16、的顺序和数据在文件对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的中的物理顺序是一致的 顺序读写需要用库函数实现顺序读写需要用库函数实现10.3.1 怎样向文件读写字符怎样向文件读写字符10.3.2 怎样向文件读写一个字符串怎样向文件读写一个字符串10.3.3 用格式化的方式读写文件用格式化的方式读写文件10.3.4 用二进制方式向文件读写一组数据用二进制方式向文件读写一组数据函数名函数名调用形式调用形式功能功能返回值返回值fgetcfgetc(fp)从从fp指向的文件指向的文件读入一个字符读入一个字符读成功,带回所读的字符,读成功,带回所读的字符,失败则返回文件结束标志失

17、败则返回文件结束标志EOF(即即-1)fputcfputc(ch,fp)把字符把字符ch写到文写到文件指针变量件指针变量fp所所指向的文件中指向的文件中写成功,返回值就是输出写成功,返回值就是输出的字符;输出失败,则返的字符;输出失败,则返回回EOF(即(即-1) 读写一个字符的函数读写一个字符的函数例例10.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个个“”为止。为止。#include #include int main() FILE *fp; char ch,filename10; printf(请输入所用的文件

18、名:请输入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,“w”)=NULL printf(无法打开此文件无法打开此文件n); exit(0); ch=getchar( ); printf(请输入一个准备存储到磁盘的字符串请输入一个准备存储到磁盘的字符串(以以#结束结束):); ch=getchar( ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); putchar(10); return 0;接收最后输入的回车符接收最后输入的回车符exit在在stdl

19、ib.h中声明:中声明: void exit ( int status );exit(0) 正常中止程序正常中止程序 exit(非非0) 非正常中止程序非正常中止程序例例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。将一个磁盘文件中的信息复制到另一个磁盘文件中。#include #include int main( ) FILE *in,*out; char ch,infile10,outfile10; printf(输入读入文件的名字输入读入文件的名字:); scanf(“%s”,infile); printf(输入输出文件的名字输入输出文件的名字:); scanf(%s,outf

20、ile); if(in=fopen(infile,r)=NULL) printf(无法打开此文件无法打开此文件n); exit(0); if(out=fopen(outfile,w)=NULL) printf(无法打开此文件无法打开此文件n); exit(0); while(!feof(in) ch=fgetc(in); fputc(ch,out); putchar(ch); putchar(10); fclose(in); fclose(out); return 0;检查当前读写位置是检查当前读写位置是否移到文件末尾否移到文件末尾 读写一个字符串的函数读写一个字符串的函数函数名函数名调用形式

21、调用形式功能功能返回值返回值fgetsfgets(str,n,fp)从从fp指向的文件读入长度指向的文件读入长度为为(n-1)的字符串,存放的字符串,存放到字符数组到字符数组str中中读成功,返回地读成功,返回地址址str,失败则,失败则返回返回NULLfputsfputs(str,fp)str所指向的字符串写到文所指向的字符串写到文件指针变量件指针变量fp所指向的文所指向的文件中件中写成功,返回写成功,返回0;否则返回非否则返回非0值值 fgets函数的函数原型为:函数的函数原型为: char *fgets (char *str,int n,FILE *fp);u其作用是从文件读入一个字符串

22、其作用是从文件读入一个字符串u调用时可以写成:调用时可以写成:fgets(str,n,fp); 说明:说明:ufgets(str,n,fp);中中n是要求得到的字符个数,但实际上只读是要求得到的字符个数,但实际上只读n-1个字符,然后在最后加一个个字符,然后在最后加一个0字符,这样得到的字符串共字符,这样得到的字符串共有有n个字符,把它们放到字符数组个字符,把它们放到字符数组str中中u如果在读完如果在读完n-1个字符之前遇到换行符个字符之前遇到换行符“n”或文件结束符或文件结束符EOF,读入即结束,但将所遇到的换行符,读入即结束,但将所遇到的换行符“n”也作为一个字也作为一个字符读入符读入u

23、执行执行fgets成功,返回成功,返回str数组首地址,如果一开始就遇到文件数组首地址,如果一开始就遇到文件尾或读数据错,返回尾或读数据错,返回NULL fputs函数的函数原型为:函数的函数原型为: int fputs (char *str, FILE *fp);ustr指向的字符串输出到指向的字符串输出到fp所指向的文件中所指向的文件中u调用时可以写成:调用时可以写成: fputs(China”,fp);ufputs函数中第一个参数可以是字符串常量、字符数组名或函数中第一个参数可以是字符串常量、字符数组名或字符型指针字符型指针u字符串末尾的字符串末尾的0不输出不输出u输出成功,函数值为;失

24、败,函数值为输出成功,函数值为;失败,函数值为EOF 一般调用方式为:一般调用方式为:fprintf(文件指针文件指针,格式字符串格式字符串,输出表列输出表列);fscanf (文件指针文件指针,格式字符串格式字符串,输入表列输入表列);如:如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,”%d,%f”,&i,&f);例例: 有有5个学生,每个学生有个学生,每个学生有3门课的成绩,从键盘输入以上数据(包门课的成绩,从键盘输入以上数据(包括学生号、姓名、括学生号、姓名、3门课成绩),计算出平均成绩,将原有数据和计门课成绩),计算出平均成绩,将原有

25、数据和计算出的平均分数存放在磁盘文件算出的平均分数存放在磁盘文件stud中。然后将文件的内容读出并中。然后将文件的内容读出并显示在屏幕上。显示在屏幕上。 #include #include struct student char num10; char name8; int score3; float ave; stu5;main ( ) int i,j,sum; FILE *fp; for(i=0;i5;i+) printf (input score of student %d: n,i+1); printf(NO.:); scanf(%s,stui.num); printf(name:);

26、 scanf(%s,); sum=0; for(j=0;j3;j+) printf(score %d:,j+1); scanf(%d,&stui.scorej); sum+=stui.scorej; stui.ave=sum/3.0; .main ( ) int i,j,sum; FILE *fp; . if(fp=fopen(stud,w)=NULL) printf(cannot open stud for write!n); exit(0); for(i=0;i5;i+) fprintf(fp, %st%st%dt%dt%dt%6.2fn, stui.num,st

27、, stui.score0, stui.score1,stui.score2,stui.ave); fclose(fp); .main ( ) . if(fp=fopen(stud,r)=NULL) printf(cannot open stud for read!n); exit(0); for(i=0;i5;i+) float f; f = stui.ave; fscanf(fp,%s%s%d%d%d%f, stui.num,, &stui.score0, &stui.score1,&stui.score2,&f); prin

28、tf(n%st%st%dt%dt%dt%6.2fn, stui.num,,stui.score0,stui.score1, stui.score2,stui.ave); fclose(fp); 一般调用形式为一般调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); buffer:是一个地址:是一个地址u对对fread来说,它是用来存放从文件读入的数据的存储区的地来说,它是用来存放从文件读入的数据的存储区的地址址u对对fwrite来说,是要把此地址开始的存储区中的数据向文件输来说,是要把此地址开始的存储区

29、中的数据向文件输出出 size:要读写的字节数:要读写的字节数 count:要读写多少个数据项:要读写多少个数据项 fp:FILE类型指针类型指针 10.4.1 文件位置标记及其定位文件位置标记及其定位10.4.2 随机读写随机读写1.文件位置标记文件位置标记 系统为每个文件设置了一个文件读写位置标记系统为每个文件设置了一个文件读写位置标记(简称文件标记简称文件标记),用来指,用来指示示“接下来要读写的下一个字符的位置接下来要读写的下一个字符的位置”。 顺序读顺序读文件文件时,文件标记时,文件标记首先首先指向文件开头,读指向文件开头,读取取一个字符后一个字符后,文件标文件标记向后移一个位置,依

30、此类推,直到遇文件尾,结束记向后移一个位置,依此类推,直到遇文件尾,结束。 顺序写文件顺序写文件时时,每写完一个数据后,文件标记顺序向后移一个位置,然,每写完一个数据后,文件标记顺序向后移一个位置,然后在下一次执行写操作时把数据写入指针所指的位置。直到把全部数据后在下一次执行写操作时把数据写入指针所指的位置。直到把全部数据写完,此时文件位置标记在最后一个数据之后写完,此时文件位置标记在最后一个数据之后。 可以根据读写的需要,人为地移动了文件标记的位置。文件标记可以向可以根据读写的需要,人为地移动了文件标记的位置。文件标记可以向前移、向后移,移到文件头或文件尾,然后对该位置进行读写前移、向后移,

31、移到文件头或文件尾,然后对该位置进行读写随机随机读写读写。随机读写随机读写可以在任何位置写入数据,在任何位置读取数据可以在任何位置写入数据,在任何位置读取数据。2. 文件位置标记的定位文件位置标记的定位(1)用用rewind函数函数使文件标记指向文件开头使文件标记指向文件开头。 例如:例如:rewind(fp);(2) 用用fseek函数函数改变文件标记改变文件标记。fseek函数的调用形式为函数的调用形式为: fseek(文件类型指针文件类型指针,位移量位移量,起始点起始点) 起始点起始点:0代表代表“文件开始位置文件开始位置”,1为为“当前位置当前位置”,2为为“文件末尾文件末尾位置位置”

32、。位移量指以起始点为基点,向前移动的字节数。位移量应是位移量指以起始点为基点,向前移动的字节数。位移量应是long型数据型数据(在数字的末尾加一个字母在数字的末尾加一个字母L)。例如:例如:fseek (fp,-10L,2); (3) 用用ftell函数函数测定文件位置标记的当前位置测定文件位置标记的当前位置。ftell函数返回当前位置相函数返回当前位置相对于文件开头的位移量。如果出错(如不存在对于文件开头的位移量。如果出错(如不存在fp指向的文件),返回值为指向的文件),返回值为-1L。例如:。例如: i=ftell(fp); if(i=-1L) printf(“errorn”); 1.ferror函数函数 ferror函数的一般调用形式为函数的一般调用形式为 ferror(fp); u如果返回值为如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论