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

下载本文档

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

文档简介

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、主要讨论的是数据文件数据文件在以前各章中所处理的数据的输入和输出在以前各章中所处理的数据的输入和输出,从终端的键盘输入数据,运行结果输出从终端的键盘输入数据,运行结果输出到终端显示器上到终端显示器上常常需要将一些数据输出到磁盘上保存起常常需要将一些数据输出到磁盘上保存起来,以后来,以后使用使用这就要用到这就要用到磁盘文件磁盘文件操作系统把操作系统把各种设备都统一作为文件处理各种设备都统一作为文件处理从操作系统的角度看,每一个与主机相联从操作系统的角度看,每一个与主机相联的输入输出设备都看作是文件。例如,的输入输出设备都看作是文件。例如,u终端键盘是输入文件终端键盘是输入文件u显示屏和打印机是输

4、出文件显示屏和打印机是输出文件“文件文件”指存储在外部介质上数据的集合指存储在外部介质上数据的集合从从C程序的观点来看,作为输入输出的各种文件程序的观点来看,作为输入输出的各种文件或设备都是统一以或设备都是统一以逻辑数据流逻辑数据流的方式出现的。的方式出现的。的数据文件由一连串的的数据文件由一连串的字符(或字节)字符(或字节)组成,组成,而不考虑行的界限,两行数据间不会自动加分隔而不考虑行的界限,两行数据间不会自动加分隔符,对文件的存取是以字符(字节)为单位的。符,对文件的存取是以字符(字节)为单位的。输入输出数据流的开始和结束仅受程序控制而不输入输出数据流的开始和结束仅受程序控制而不受物理符

5、号(如回车换行符)控制,这就增加了受物理符号(如回车换行符)控制,这就增加了处理的灵活性。这种文件称为处理的灵活性。这种文件称为流式文件流式文件。文件要有一个唯一的文件标识,以便用户文件要有一个唯一的文件标识,以便用户识别和引用。识别和引用。文件标识包括三部分:文件标识包括三部分:(1)文件路径文件路径(2)文件名主干文件名主干(3)文件后缀文件后缀文件路径表示文件在外部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面文件路径文件

6、路径文件名主干文件名主干文件后缀文件后缀文件路径表示文件在外部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面文件名文件名文件路径表示文件在外部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面命名规则遵循标命名规则遵循标识符的命名规则识符的命名规则文件路径表示文件在外

7、部存储设备中的位文件路径表示文件在外部存储设备中的位置。如:置。如: D: CCtempfile1.datu表示表示file1.dat文件存放在文件存放在D盘中的盘中的CC目录下目录下的的temp子目录下面子目录下面一般不超过一般不超过3个字母个字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)等)根据数据的组织形式,数据文件可分为根据数据的组织形式,数据文件可分为ASCII文件文件和和二进制文件二进制文件。u数据在内存中是以二进制形式存储的,如果不数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件加转换地输出到外存,就是二进制文件u如果要求在

8、外存上以如果要求在外存上以ASCII代码形式存储,代码形式存储,则需要在存储前进行转换则需要在存储前进行转换uASCII文件又称文本文件,每一个字节放一文件又称文本文件,每一个字节放一个字符的个字符的ASCII代码代码字符一律以字符一律以ASCII形式存储形式存储数值型数据既可以用数值型数据既可以用ASCII形式存储,也形式存储,也可以用二进制形式存储可以用二进制形式存储u如有整数如有整数10000,如果用,如果用ASCII码形式输出码形式输出到磁盘,则在磁盘中占个字节到磁盘,则在磁盘中占个字节(每一个字符每一个字符占一个字节占一个字节),而用二进制形式输出,则在磁,而用二进制形式输出,则在磁

9、盘上只占盘上只占4个字节个字节(用用VC+ C时时)0011000100110000001100000011000000110000(1)(0)(0)(0)(0)ASCII形式形式00000000000000000010011100010000二进制形式二进制形式(10000)ANSI C标准采用标准采用“缓冲文件系统缓冲文件系统”处理处理数据文件数据文件所谓所谓缓冲文件系统缓冲文件系统是指系统自动地在内存是指系统自动地在内存区为程序中每一个正在使用的文件开辟一区为程序中每一个正在使用的文件开辟一个文件缓冲区个文件缓冲区从内存向磁盘从内存向磁盘输出数据输出数据必须先送到内存中必须先送到内存中的

10、缓冲区,装满缓冲区后才一起送到磁盘的缓冲区,装满缓冲区后才一起送到磁盘去去如果从磁盘向计算机如果从磁盘向计算机读入数据读入数据,则一次从,则一次从磁盘文件将一批数据输入到内存缓冲区(磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)数据送到程序数据区(给程序变量)缓冲文件系统中,关键的概念是缓冲文件系统中,关键的概念是“文件类文件类型指针型指针”,简称,简称“文件指针文件指针”u每个被使用的文件都在内存中开辟一个相应的每个被使用的文件都在内存中开辟一个相应的文件信息区文件信息区,用来存放文件的有关信息(如

11、文,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)件的名字、文件状态及文件当前位置等)u这些信息是保存在一个结构体变量中的。该这些信息是保存在一个结构体变量中的。该结结构体类型构体类型是由系统声明的,取名为是由系统声明的,取名为FILE声明声明FILE结构体类型的信息包含在头文件结构体类型的信息包含在头文件“stdio.h”中中一般一般设置一个指向设置一个指向FILE类型变量的指针变类型变量的指针变量,然后通过它来引用这些量,然后通过它来引用这些FILE类型变量类型变量uFILE *fp;10.2.1 用用fopen函数打开数据文件函数打开数据文件10.2.2 用用fclos

12、e函数关闭数据文件函数关闭数据文件对文件读写之前应该对文件读写之前应该“打开打开”该文件,在该文件,在使用结束之后应使用结束之后应“关闭关闭”该文件。该文件。所谓所谓“打开打开”是指为文件建立相应的信息是指为文件建立相应的信息区区(用来存放有关文件的信息用来存放有关文件的信息)和文件缓冲和文件缓冲区区(用来暂时存放输入输出的数据用来暂时存放输入输出的数据)。所谓所谓“关闭关闭”是指撤销文件信息区和文件是指撤销文件信息区和文件缓冲区缓冲区fopen函数的调用方式为:函数的调用方式为:fopen(文件名文件名,使用文件方式使用文件方式);例如:例如: fopen(“a1”,”r”); u表示要打开

13、名为表示要打开名为“a1”的文件,使用文件方的文件,使用文件方式为式为“读入读入”ufopen函数的返回值是指向函数的返回值是指向a1文件的指针文件的指针通常将通常将fopen函数的返回值赋给一个指向函数的返回值赋给一个指向文件的指针变量。如:文件的指针变量。如:FILE *fp; fp=fopen(“a1”,”r”);ufp和文件和文件a1相联系,相联系,fp指向了指向了a1文件文件在打开一个文件时,通知编译系统以下在打开一个文件时,通知编译系统以下3个信息:个信息:需要访问的文件的名字需要访问的文件的名字使用文件的方式(使用文件的方式(“读读”还是还是“写写”等)等)让哪一个指针变量指向被

14、打开的文件让哪一个指针变量指向被打开的文件使用文件方式使用文件方式参参见见教材教材表表10.1。说明:说明:(1) 用用“r”方式打开的文件只能用于方式打开的文件只能用于向计算向计算机输入机输入而不能用作向该文件输出数据,而且而不能用作向该文件输出数据,而且该文件应该已经存在该文件应该已经存在,并存有数据,这样程,并存有数据,这样程序才能从文件中读数据。序才能从文件中读数据。u不能用不能用“r”方式打开一个并不存在的文件,方式打开一个并不存在的文件,否则出错。否则出错。说明:说明:(2) 用用“w”方式打开的文件只能用于方式打开的文件只能用于向该文向该文件写数据件写数据(即输出文件),而不能用

15、来向计(即输出文件),而不能用来向计算机输入。算机输入。u如果原来不存在如果原来不存在该文件,则在打开文件前新该文件,则在打开文件前新建立一个以指定的名字命名的文件。建立一个以指定的名字命名的文件。u如果原来已存在如果原来已存在一个以该文件名命名的文件一个以该文件名命名的文件,则在打开文件前先将该文件删去,然后重,则在打开文件前先将该文件删去,然后重新建立一个新文件。新建立一个新文件。说明:说明:(3) 如果希望如果希望向文件末尾添加新的数据向文件末尾添加新的数据(不希(不希望删除原有数据),则应该用望删除原有数据),则应该用“a”方式打开方式打开u但此时但此时应保证该文件已存在应保证该文件已

16、存在;否则将得到出;否则将得到出错信息。错信息。u打开文件时,文件读写标记移到文件末尾打开文件时,文件读写标记移到文件末尾说明:说明:(4) 用用r+、w+、a+方式打开的文件既可以方式打开的文件既可以用来输入数据,也可以用来输出数据。用来输入数据,也可以用来输出数据。u用用r+方式时该文件应该已经存在。方式时该文件应该已经存在。u用用w+方式则新建立一个文件,先向此文件方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。写数据,然后可以读此文件中的数据。u用用a+方式打开的文件,原来的文件不被删去方式打开的文件,原来的文件不被删去,文件读写位置标记移到文件末尾,可以添,文件读写

17、位置标记移到文件末尾,可以添加,也可以读。加,也可以读。说明:说明:(5) 如果打开如果打开失败失败,fopen函数将会带回一个函数将会带回一个出错信息。出错信息。fopen函数将带回一个空指针值函数将带回一个空指针值NULL常用下面的方法打开一个文件:常用下面的方法打开一个文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”); exit(0);终止正在执行的程序终止正在执行的程序说明:说明:(6) C标准建议用标准建议用表表10.1列出的文件使用方式列出的文件使用方式打开文本文件或二进制文件,但目前使用的打开文本文

18、件或二进制文件,但目前使用的有些有些C编译系统可能不完全提供所有这些功能编译系统可能不完全提供所有这些功能说明:说明:(7) 计算机输从计算机输从ASCII文件文件读入读入字符时,遇到字符时,遇到回车换行符,系统把它转换为一个换行符,回车换行符,系统把它转换为一个换行符,在在输出输出时把换行符转换成为回车和换行两个时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。的数据形式完全一致,一一对应。说明:说明:(8) 程序中可以使用程序中

19、可以使用3个标准的流文件个标准的流文件:标准输标准输入流、标准输出流、标准出错输出流。入流、标准输出流、标准出错输出流。u系统已对这系统已对这3个文件指定了与终端的对应关系个文件指定了与终端的对应关系u标准输入流标准输入流stdin是从终端的输入是从终端的输入u标准输出流标准输出流stdout是向终端的输出是向终端的输出u标准出错输出流标准出错输出流stderr是当程序出错时将出是当程序出错时将出错信息发送到终端错信息发送到终端程序开始运行时程序开始运行时系统自动打开这系统自动打开这3个标准个标准流文件流文件。因此,程序编写者不需要在程。因此,程序编写者不需要在程序中用序中用fopen函数打开

20、它们。所以以前函数打开它们。所以以前我们用到的从终端输入或输出到终端都我们用到的从终端输入或输出到终端都不需要打开终端文件。不需要打开终端文件。关闭文件用关闭文件用fclose函数。函数。fclose函数调函数调用的一般形式为用的一般形式为fclose(文件指针文件指针); 例如:例如: fclose (fp); 如果不关闭文件将会如果不关闭文件将会丢失丢失数据。数据。10.3.1 怎样向文件读写字符怎样向文件读写字符10.3.2 怎样向文件读写一个字符串怎样向文件读写一个字符串10.3.3 用格式化的方式读写文用格式化的方式读写文件件10.3.4 用二进制方式向文件读写一组数据用二进制方式向

21、文件读写一组数据函数名函数名调用形式调用形式功能功能返回值返回值fgetcfgetc(fp)从从fp指向的指向的文件读入一文件读入一个字符个字符读成功,带回所读读成功,带回所读的字符,失败则返的字符,失败则返回文件结束标志回文件结束标志(即即-1)fputcfputc(ch,fp)把字符把字符ch写写到文件指针到文件指针变量变量fp所指所指向的文件中向的文件中写成功,返回值就写成功,返回值就是输出的字符;输是输出的字符;输出失败,则返回出失败,则返回(即(即-1)读写一个字符的函数读写一个字符的函数读写一个字符串的函数读写一个字符串的函数函数名函数名调用形式调用形式功能功能返回值返回值fget

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

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

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

25、败,函数值为输出成功,函数值为;失败,函数值为EOF一般调用方式为:一般调用方式为:fprintf(文件指针文件指针,格式字符串格式字符串,输出表列输出表列);fscanf (文件指针文件指针,格式字符串格式字符串,输入表列输入表列);如:如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,”%d,%f”,&i,&f);一般调用形式为一般调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); buffer:是一个地址:是一个地址u对对fread来说,它是用来存放从文件读入的来说

26、,它是用来存放从文件读入的数据的存储区的地址数据的存储区的地址u对对fwrite来说,是要把此地址开始的存储区来说,是要把此地址开始的存储区中的数据向文件输出中的数据向文件输出size:要读写的字节数:要读写的字节数count:要读写多少个数据项:要读写多少个数据项fp:FILE类型指针类型指针10.4.1 文件位置标记及其定位文件位置标记及其定位10.4.2 随机读写随机读写1.文件位置标记文件位置标记为了对读写进行控制,系统为每个文为了对读写进行控制,系统为每个文件设置了一个件设置了一个文件读写位置标记文件读写位置标记(简简称文件标记称文件标记),用来指示,用来指示“接下来要接下来要读写的

27、下一个字符的位置读写的下一个字符的位置”文件指针文件指针读写当前位置读写当前位置文件尾文件尾1.文件位置标记文件位置标记文件头文件头1.文件位置标记文件位置标记如果是如果是顺序写文件顺序写文件,则每写完一个数据,则每写完一个数据后,文件标记顺序向后移一个位置,然后,文件标记顺序向后移一个位置,然后在下一次执行写操作时把数据写入指后在下一次执行写操作时把数据写入指针所指的位置。直到把全部数据写完,针所指的位置。直到把全部数据写完,此时文件位置标记在最后一个数据之后此时文件位置标记在最后一个数据之后1.文件位置标记文件位置标记可以根据读写的需要,人为地移动了文可以根据读写的需要,人为地移动了文件标

28、记的位置。文件标记可以向前移、件标记的位置。文件标记可以向前移、向后移,移到文件头或文件尾,然后对向后移,移到文件头或文件尾,然后对该位置进行读写该位置进行读写随机读写随机读写随机读写随机读写可以在任何位置写入数据,在可以在任何位置写入数据,在任何位置读取数据任何位置读取数据2. 文件位置标记的定位文件位置标记的定位u可以强制使文件位置标记指向指定的位置可以强制使文件位置标记指向指定的位置u可以用以下函数实现可以用以下函数实现:(1)用用rewind函数函数使文件标记指向文件开头使文件标记指向文件开头 rewind函数的作用是使文件标记重新返回文函数的作用是使文件标记重新返回文件的开头,此函数

29、没有返回值。件的开头,此函数没有返回值。2. 文件位置标记的定位文件位置标记的定位u可以强制使文件标记指向指定的位置可以强制使文件标记指向指定的位置u可以用以下函数实现可以用以下函数实现:(2) 用用fseek函数函数改变文件标记改变文件标记fseek函数的调用形式为函数的调用形式为:fseek(文件类型指针文件类型指针,位移量位移量,起始点起始点) u起始点起始点0代表代表“文件开始位置文件开始位置”,1为为“当前当前位置位置”,2为为“文件末尾位置文件末尾位置”标准指定的名字标准指定的名字起始点起始点名名 字字用数字代表用数字代表文件开始位置文件开始位置SEEK_SET0文件当前位置文件当

30、前位置SEEK_CUR1文件末尾位置文件末尾位置SEEK_END2位移量指以起始点为基点,向前移动的字位移量指以起始点为基点,向前移动的字节数。节数。位移量应是位移量应是long型数据型数据(在数字的在数字的末尾加一个字母末尾加一个字母L)。fseek函数一般用于二进制文件。下面是函数一般用于二进制文件。下面是fseek函数调用的几个例子:函数调用的几个例子: ufseek (fp,100L,0); ufseek (fp,50L,1); ufseek (fp,-10L,2); 2. 文件位置标记的定位文件位置标记的定位u可以强制使文件位置标记指向指定的位置可以强制使文件位置标记指向指定的位置u

31、可以用以下函数实现可以用以下函数实现:(3) 用用ftell函数函数测定文件位置标记的当前位置测定文件位置标记的当前位置ftell函数的作用是得到流式文件中文件位置标函数的作用是得到流式文件中文件位置标记的当前位置。记的当前位置。由于文件中的文件位置标记经常移动,人由于文件中的文件位置标记经常移动,人们往往不容易知道其当前位置,所以常用们往往不容易知道其当前位置,所以常用ftell函数得到当前位置,用函数得到当前位置,用相对于文件开相对于文件开头的位移量来头的位移量来表示。如果调用函数时出错表示。如果调用函数时出错(如不存在(如不存在fp指向的文件),指向的文件),ftell函数返函数返回值为回值为-1L。例如:。

温馨提示

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

评论

0/150

提交评论