kj-第12章文件ppt课件(全).ppt
第第12章章 文件文件 本章概述 本章的学习目标主要内容1本章概述本章概述l文件操作是文件操作是C语言程序设计中的重要组成部语言程序设计中的重要组成部分。很多应用问题中会用到文件操作。分。很多应用问题中会用到文件操作。l本章讨论本章讨论C语言程序设计中的文件操作。包语言程序设计中的文件操作。包括文件的打开与关闭、文件的定位与检测、括文件的打开与关闭、文件的定位与检测、文件的读写所使用的各种函数和编程方法。文件的读写所使用的各种函数和编程方法。2本章的学习目标本章的学习目标l本章教学目的:理解文件的概念,掌握用本章教学目的:理解文件的概念,掌握用来进行文件的打开、关闭、定位、检测、来进行文件的打开、关闭、定位、检测、读写操作的方法。读写操作的方法。l本章教学重点:文件的读写本章教学重点:文件的读写l本章教学难点:文件的定位与检测本章教学难点:文件的定位与检测3主要内容主要内容12.1 文件概述文件概述 12.2 文件的打开与关闭文件的打开与关闭 12.3 文件的定位和检测文件的定位和检测 12.4 文件的读写文件的读写 12.5 程序设计举例程序设计举例 412.1 文件概述文件概述 12.1.1 文件文件l文件是程序设计中的一个重要概念,所谓文件是程序设计中的一个重要概念,所谓“文件文件”是指存储在外部介质是指存储在外部介质(如磁盘)上的一组相关数据的集合,(如磁盘)上的一组相关数据的集合,为了便于定位这组数据,通常要为为了便于定位这组数据,通常要为它取一个名称,即文件名。操作系统就是以文件为单位对数据进行管理的,它取一个名称,即文件名。操作系统就是以文件为单位对数据进行管理的,如果想找存储在外部介质上的数据,必须按文件名找到存放该数据的文件,如果想找存储在外部介质上的数据,必须按文件名找到存放该数据的文件,然后再从文件中读取数据。然后再从文件中读取数据。l从用户的角度来看,文件可以分普通文件和设备文件。从用户的角度来看,文件可以分普通文件和设备文件。l普通文件普通文件是驻留在外部介质上的有序数据集,它可以是源文件、目标文件、是驻留在外部介质上的有序数据集,它可以是源文件、目标文件、可执行程序,也可是一组待输入的原始数据,或者是一组输出结果。前者可执行程序,也可是一组待输入的原始数据,或者是一组输出结果。前者通常称为程序文件,后者则可称为数据文件。通常称为程序文件,后者则可称为数据文件。l设备文件设备文件是指与主机相联的各种外部设备,如显示器、键盘等,对于操作是指与主机相联的各种外部设备,如显示器、键盘等,对于操作系统而言,每一个与主机相联的输入系统而言,每一个与主机相联的输入/输出设备都是一个文件,其输入输输出设备都是一个文件,其输入输出等同于文件的读和写。出等同于文件的读和写。l例如,通常例如,通常将显示器定义为标准输出文件,将键盘定义为标准输入文件。将显示器定义为标准输出文件,将键盘定义为标准输入文件。我们前面使用的我们前面使用的printf()、putchar()等等C函数就是输出到标准输出文件函数就是输出到标准输出文件(即显示器),(即显示器),scanf()、getchar()等等C函数就是从标准输入文件(即键函数就是从标准输入文件(即键盘)输入数据。盘)输入数据。512.1 文件概述文件概述 12.1.2 数据文件的存储形式数据文件的存储形式l从文件的编码方式来看,文件可以分为从文件的编码方式来看,文件可以分为ASCII码文件和码文件和二进制文件两种。二进制文件两种。lASCII码文件也称为文本文件,这种文件在磁盘中存储码文件也称为文本文件,这种文件在磁盘中存储时每个字符对应一个字节,存放的是该字符的时每个字符对应一个字节,存放的是该字符的ASCII码码值。值。l二进制文件是把内存中的数据按其在内存中的存储形式二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。原样输出到磁盘上存放。lASCII码文件内容可以在屏幕上按字符显示,例如码文件内容可以在屏幕上按字符显示,例如C源程源程序文件就是序文件就是ASCII文件,在文件,在windows中可以直接用记事中可以直接用记事本打开阅读。由于本打开阅读。由于ASCII码文件是按字符显示,因此能码文件是按字符显示,因此能读懂其内容,而二进制文件虽然有时也能显示在屏幕上,读懂其内容,而二进制文件虽然有时也能显示在屏幕上,但其内容却无法直接读懂。但其内容却无法直接读懂。6l图图12.1中,中,00110001、00110010、00110011、00110100分别是字符分别是字符1、2、3、4的的ASCII码值的二进制形式。码值的二进制形式。l例如,数字例如,数字1234的几种存储形式如图的几种存储形式如图12.1所示:所示:7l存储内容用存储内容用ASCII码形式输出时,其字节与字符一一对应,一个码形式输出时,其字节与字符一一对应,一个字节代表一个字符,便于对字符进行逐个处理,也便于输出字字节代表一个字符,便于对字符进行逐个处理,也便于输出字符,但一般占用的存储空间较多,而且要花费转换时间。符,但一般占用的存储空间较多,而且要花费转换时间。l用二进制形式输出,可以节省外存空间和转换时间,但一个字用二进制形式输出,可以节省外存空间和转换时间,但一个字节与字符无一一对应关系,不能直接输出字符形式。一般中间节与字符无一一对应关系,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,常用二进制文件保存。结果数据需要暂时保存在外存上,常用二进制文件保存。l因为因为C文件是一串字节流或二进制流,所以文件是一串字节流或二进制流,所以C系统在处理这些文系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制,即在输出时不会自动增加回车换行符以作为回车符)的控制,即在输出时不会自动增加回车换行符以作为记录结束的标志,输入时不以回车换行符作为记录的间隔。我记录结束的标志,输入时不以回车换行符作为记录的间隔。我们把这种文件称作们把这种文件称作“流式文件流式文件”。C语言允许对文件存取一个语言允许对文件存取一个字符,有很强的灵活性。字符,有很强的灵活性。812.1.3 标准文件与非标准文件标准文件与非标准文件l在老版本的在老版本的C(如(如Unix下的下的C)中对文件的处理)中对文件的处理方式有两种:方式有两种:l一种是缓冲文件系统一种是缓冲文件系统又称标准文件系统,又称标准文件系统,l另一种是非缓冲文件系统另一种是非缓冲文件系统又称非标准文件系又称非标准文件系统。统。9l所谓所谓“缓冲文件系统缓冲文件系统”是指系统自动地在内存区为每是指系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据时必须先送到内存中的缓冲区,缓冲区装满输出数据时必须先送到内存中的缓冲区,缓冲区装满数据后,再一起送到磁盘中去。同样,从磁盘向内存数据后,再一起送到磁盘中去。同样,从磁盘向内存中读入数据时,则一次从磁盘文件中将一批数据读入中读入数据时,则一次从磁盘文件中将一批数据读入到缓冲区,然后再从缓冲区逐个地将数据送到程序数到缓冲区,然后再从缓冲区逐个地将数据送到程序数据区(给程序中的变量),如图据区(给程序中的变量),如图12.2所示。缓冲区的所示。缓冲区的大小随大小随C的版本不同而不同,一般为的版本不同而不同,一般为512字节。字节。10l所谓所谓“非缓冲文件系统非缓冲文件系统”是指系统不会自动是指系统不会自动开辟确定大小的缓冲区,而由程序为每个文开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。件设定缓冲区。lC语言中没有专门的输入输出语句,对文件语言中没有专门的输入输出语句,对文件的读写都是用库函数来实现的,的读写都是用库函数来实现的,ANSI规定了规定了输入输出函数,用它们对文件进行读写。输入输出函数,用它们对文件进行读写。l本章只介绍本章只介绍ANSI C规定的缓冲文件系统,即规定的缓冲文件系统,即标准文件系统。标准文件系统。1112.1.4 文件类型指针文件类型指针l 在缓冲文件系统中有一个关键概念是在缓冲文件系统中有一个关键概念是“文件类型指针文件类型指针”,每一个,每一个存在的文件都在内存中开辟一个区域,用来存放文件的有关信息(如文存在的文件都在内存中开辟一个区域,用来存放文件的有关信息(如文件的名称、文件状态、文件当前位置等),这些信息保存在一个结构体件的名称、文件状态、文件当前位置等),这些信息保存在一个结构体变量中,该结构体由系统声明,取名为变量中,该结构体由系统声明,取名为FILE。l Turbo C在在stdio.h文件中有以下的类型声明:文件中有以下的类型声明:ltypedef structl short level;/*缓冲区缓冲区“满满”或或“空空”的程度的程度*/l unsigned flags;/*文件状态标志文件状态标志*/l char fd;/*文件描述符文件描述符*/l unsigned char hold;/*如无缓冲区不读取字符如无缓冲区不读取字符*/l short bsize;/*缓冲区的大小缓冲区的大小*/l unsigned char*buffer;/*数据缓冲区的位置数据缓冲区的位置*/l unsigned char*curp;/*指针,当前的指向指针,当前的指向*/l unsigned istemp;/*临时文件临时文件,指示器指示器*/l short token;/*用于有效性检查用于有效性检查*/lFILE;1212.1.4 文件类型指针文件类型指针l 定义文件类型指针变量的格式为:定义文件类型指针变量的格式为:l FILE *指针变量标识符;指针变量标识符;l例如:例如:FILE *fp;l 上面的定义表示上面的定义表示fp是指向文件类型的指针变量。是指向文件类型的指针变量。l 文件被打开时,系统自动为该文件定义一个文件被打开时,系统自动为该文件定义一个FILE类型变类型变量,使该文件与对应的量,使该文件与对应的FILE类型变量建立联系。因为类型变量建立联系。因为fp是指是指向向FILE类型的指针变量,通过类型的指针变量,通过fp即可找到存放该文件信息的即可找到存放该文件信息的FILE类型变量,然后按变量提供的信息找到该文件,对该文类型变量,然后按变量提供的信息找到该文件,对该文件实施操作。件实施操作。l 习惯上笼统地把习惯上笼统地把fp称为文件类型指针。所谓打开文件就称为文件类型指针。所谓打开文件就是指建立文件的各种有关信息,并使是指建立文件的各种有关信息,并使FILE类型指针指向该文类型指针指向该文件,以便对文件进行操作。关闭文件则断开件,以便对文件进行操作。关闭文件则断开FILE类型指针与类型指针与该文件间的联系,也就禁止对该文件进行操作。该文件间的联系,也就禁止对该文件进行操作。1312.2 文件的打开与关闭文件的打开与关闭 12.2.1 打开文件的函数(打开文件的函数(fopen)函数函数fopen用来打开文件,函数用来打开文件,函数fopen的使用格式如下:的使用格式如下:FILE *fp;fp=fopen(文件名,文件使用方式文件名,文件使用方式)例如:例如:fp=fopen(“d:exerciseuser.txt”,“r”);表表示示要要打打开开的的文文件件名名为为user.txt,文文件件在在d:exercise目目录录下下,使使用用文文件件的的方方式式为为“只只读读”(r代代表表读读)。fopen函函数数带带回回指指向向user.txt文文件件的的指指针针并并赋赋给给fp,这样这样fp就指向就指向user.txt文件。文件。由上面例子可以看出,在打开一个文件时,通知编译系统以下信息:由上面例子可以看出,在打开一个文件时,通知编译系统以下信息:需要打开的文件标识,也就是文件的位置及文件名;需要打开的文件标识,也就是文件的位置及文件名;使用文件的方式(是使用文件的方式(是“读读”还是还是“写写”等);等);让哪一个指针指向被打开的文件。让哪一个指针指向被打开的文件。14表表12-1 12-1 文件的使用方式文件的使用方式字符含 义r r以只以只读读方式打开一个文本文件。文件必方式打开一个文本文件。文件必须须存在,否存在,否则则打开失打开失败败。打。打开后,文件内部的位置指开后,文件内部的位置指针针指向文件首部的第一个字符。指向文件首部的第一个字符。w w以只写方式打开一个文本文件。若文件不存在,以只写方式打开一个文本文件。若文件不存在,则则建立建立该该文件。若文件。若文件已存在,文件已存在,则删则删除原文件内容,写入新内容。除原文件内容,写入新内容。a a以追加方式打开一个文本文件。只能向文件尾追加数据。文件必以追加方式打开一个文本文件。只能向文件尾追加数据。文件必须须存在,否存在,否则则打开失打开失败败。打开后,文件内部的位置指。打开后,文件内部的位置指针针指向文件尾。指向文件尾。rbrb以只以只读读方式打开一个二方式打开一个二进进制文件。文件必制文件。文件必须须存在,否存在,否则则打开失打开失败败。打开后,文件内部的位置指打开后,文件内部的位置指针针指向文件首部的第一个字指向文件首部的第一个字节节。wbwb以只写方式打开一个二以只写方式打开一个二进进制文件。若文件不存在,制文件。若文件不存在,则则建立建立该该文件。文件。若文件已存在,若文件已存在,则删则删除原文件内容,写入新内容。除原文件内容,写入新内容。abab以追加方式打开一个二以追加方式打开一个二进进制文件。只能向文件尾追加数据。文件必制文件。只能向文件尾追加数据。文件必须须存在,否存在,否则则打开失打开失败败。打开后,文件内部的位置指。打开后,文件内部的位置指针针指向文件尾。指向文件尾。15表表12-1 12-1 文件的使用方式文件的使用方式字符含 义r+r+以以读读/写方式打开一个文本文件。文件必写方式打开一个文本文件。文件必须须存在。打开后,文件内部的位置指存在。打开后,文件内部的位置指针针指指向文件首部的第一个字符。打开后,可以向文件首部的第一个字符。打开后,可以读读取文本内容,也可以写入文本内容,取文本内容,也可以写入文本内容,也可以既也可以既读读又写。又写。w+w+以以读读/写方式打开或新建立一个文本文件。若文件已存在,写方式打开或新建立一个文本文件。若文件已存在,则则新的写操作将覆盖原新的写操作将覆盖原来的数据。若文件不存在,来的数据。若文件不存在,则则建立一个新文件。建立一个新文件。还还可以在不关可以在不关闭闭文件的情况下,文件的情况下,再再读读取文件内容。取文件内容。a+a+以以读读和追加的方式打开一个文本文件。允和追加的方式打开一个文本文件。允许读许读或追加。文件必或追加。文件必须须存在,否存在,否则则打开打开失失败败。打开后,文件内部的位置指。打开后,文件内部的位置指针针指向文件尾。可在文件尾追加数据,也可将指向文件尾。可在文件尾追加数据,也可将位置指位置指针针移到某个位置,移到某个位置,读读取文件内容。取文件内容。rb+rb+以以读读/写方式打开二写方式打开二进进制文件。文件必制文件。文件必须须存在。打开后,文件内部的位置指存在。打开后,文件内部的位置指针针指向指向文件首部的第一个字文件首部的第一个字节节。打开后,可以。打开后,可以读读取数据,也可以写入数据,也可以既取数据,也可以写入数据,也可以既读读又写又写。wb+wb+以以读读/写方式打开或新建立一个二写方式打开或新建立一个二进进制文件。若文件已存在,制文件。若文件已存在,则则新的写操作将覆盖新的写操作将覆盖原来的数据。若文件不存在,原来的数据。若文件不存在,则则建立一个新文件。建立一个新文件。还还可以在不关可以在不关闭闭文件的情况下,文件的情况下,再再读读取文件内容。取文件内容。ab+ab+以以读读和追加的方式打开一个二和追加的方式打开一个二进进制文件。允制文件。允许读许读或追加。文件必或追加。文件必须须存在,否存在,否则则打打开失开失败败。打开后,文件内部的位置指。打开后,文件内部的位置指针针指向文件尾。可在文件尾追加数据,也可指向文件尾。可在文件尾追加数据,也可将位置指将位置指针针移到某个位置,移到某个位置,读读取数据。取数据。1612.2 文件的打开与关闭文件的打开与关闭 如如果果成成功功打打开开一一个个文文件件,则则fopen()函函数数将将返返回回一一个个指指向向该该文文件件的的指指针针,否否则则将将返返回回空空指指针针(NULL),由由此此可可以以判判断断一个文件是否成功打开。一个文件是否成功打开。1712.2 文件的打开与关闭文件的打开与关闭 12.2.2 关闭文件的函数关闭文件的函数fclose fclose函数用来关闭一个文件,其使用格式如下:函数用来关闭一个文件,其使用格式如下:fclose(文件类型指针文件类型指针);例如:例如:fclose(fp);用用fclose函数关闭一个由函数关闭一个由fopen函数打开的文件,当文函数打开的文件,当文件关闭成功时返回件关闭成功时返回0,否则返回,否则返回EOF。EOF是在是在stdio.h中定中定义的符号常量,值为义的符号常量,值为-1。可以根据该函数返回的值判断文。可以根据该函数返回的值判断文件是否正常关闭。件是否正常关闭。1812.2 文件的打开与关闭文件的打开与关闭 例例12.1 打开与关闭文件示例。打开与关闭文件示例。#include int main()FILE*fp;int i;fp=fopen(“cj.dat”,“rb”);if(fp=NULL)printf(“File open failed!n”);else printf(“File open successful!n”);i=fclose(fp);if(i=0)printf(“File close successful!n”);else printf(“File close failed!n”);return 0;1912.3 文件的定位和检测文件的定位和检测 12.3.1 文件的顺序读写和随机读写文件的顺序读写和随机读写l对文件的读写方式有两种:顺序读写和随机读写,也称为顺序对文件的读写方式有两种:顺序读写和随机读写,也称为顺序存取和随机存取。存取和随机存取。l顺序读写的特点是:从文件开始到文件结尾,一个字节一个字顺序读写的特点是:从文件开始到文件结尾,一个字节一个字节地顺序读写,读写完第一个字节,才能顺序读写第二个字节,节地顺序读写,读写完第一个字节,才能顺序读写第二个字节,读写完第二个字节,才能顺序读写第三个字节,读写完第二个字节,才能顺序读写第三个字节,依次类推。,依次类推。l随机读写的特点是:允许从文件的任何位置开始读写,利用后随机读写的特点是:允许从文件的任何位置开始读写,利用后面介绍的面介绍的fseek和和rewind函数函数,可以使文件内部的位置指针指,可以使文件内部的位置指针指向某一个位置,从该位置开始读写。向某一个位置,从该位置开始读写。l用程序来控制文件内部的位置指针的移动,称为文件的定位。用程序来控制文件内部的位置指针的移动,称为文件的定位。对于存储在磁盘上的文件,既可以采用顺序读写方式,也可以对于存储在磁盘上的文件,既可以采用顺序读写方式,也可以采用随机读写方式。采用随机读写方式。2012.3 文件的定位和检测文件的定位和检测 12.3.2 rewind函数和函数和fseek函数函数 1rewind函数函数 rewind函数的使用格式:函数的使用格式:rewind(文件类型指针文件类型指针);例如:例如:rewind(fp);rewind函数的功能是把文件内部的位置指针重新函数的功能是把文件内部的位置指针重新定位到文件的开头,此函数无返回值。定位到文件的开头,此函数无返回值。注意:刚打开文件时,文件内部的位置指针是定位注意:刚打开文件时,文件内部的位置指针是定位在文件的开头,即文件首。在文件的开头,即文件首。2112.3 文件的定位和检测文件的定位和检测 12.3.2 rewind函数和函数和fseek函数函数 2fseek函数函数fseek函数的使用格式如下:函数的使用格式如下:fseek(文件类型指针,位移量,起始点);(文件类型指针,位移量,起始点);fseek函数的功能是移动文件内部的位置指针函数的功能是移动文件内部的位置指针到规定的位置。到规定的位置。2212.3 文件的定位和检测文件的定位和检测 fseek函数的第一个参数是函数的第一个参数是“文件类型指针文件类型指针”,指明了要操作,指明了要操作是哪一个文件。第二个参数是是哪一个文件。第二个参数是“位移量位移量”,指明了从,指明了从“起始点起始点”开开始移动的字节数,位移量必须是长整型数据,加后缀始移动的字节数,位移量必须是长整型数据,加后缀“L”;若位移;若位移量是正整数,表示文件内部的位置指针向文件尾方向移动,若位移量是正整数,表示文件内部的位置指针向文件尾方向移动,若位移量是负整数,表示文件内部的位置指针向文件首方向移动。第三个量是负整数,表示文件内部的位置指针向文件首方向移动。第三个参数是参数是“起始点起始点”,指明了移动时的起始位置,起始点有三种取值,指明了移动时的起始位置,起始点有三种取值,分别代表文件首、文件尾和当前位置,如表分别代表文件首、文件尾和当前位置,如表12-2所示。所示。表表12-2 fseek函数的起始点函数的起始点符号常符号常量量数数值值含含义义SEEK_SESEEK_SET T0 0从文件首开始移从文件首开始移动动SEEK_CUSEEK_CUR R1 1从文件的当前位从文件的当前位置开始移置开始移动动SEEK_ENSEEK_END D2 2从文件尾开始移从文件尾开始移动动23l例如:例如:lfseek(fp,100L,SEEK_SET);或或fseek(fp,100L,0);l将文件内部的位置指针从文件首开始向文件尾方向移动将文件内部的位置指针从文件首开始向文件尾方向移动100个字节。个字节。lfseek(fp,20L,SEEK_CUR);或或fseek(fp,20L,1);l将文件内部的位置指针从当前位置向文件尾方向移动将文件内部的位置指针从当前位置向文件尾方向移动20个字个字节。节。lfseek(fp,-30L,SEEK_CUR);或或fseek(fp,-30L,1);l将文件内部的位置指针从当前位置向文件首方向移动将文件内部的位置指针从当前位置向文件首方向移动30个字个字节。节。lfseek(fp,-10L,SEEK_END);或或fseek(fp,-10L,2);l将文件内部的位置指针从文件尾开始向文件首方向移动将文件内部的位置指针从文件尾开始向文件首方向移动10个个字节。字节。2412.3 文件的定位和检测文件的定位和检测 l12.3.3 feof函数和函数和ftell函数函数l 1feof函数函数l feof函数的使用格式如下:函数的使用格式如下:l feof(文件类型指针文件类型指针);l feof函数是用来检测文件位置指针是否到达文件尾,若函数是用来检测文件位置指针是否到达文件尾,若到达文件尾则返回一个非到达文件尾则返回一个非0值(真),否则返回值(真),否则返回0(假)。(假)。当我们对文件操作时,例如顺序读取文件的所有数据,可当我们对文件操作时,例如顺序读取文件的所有数据,可以使用这个函数来判断文件内容是否结束,若文件内容没以使用这个函数来判断文件内容是否结束,若文件内容没有结束,则继续读取数据,否则结束读取操作。有结束,则继续读取数据,否则结束读取操作。l 下面的循环语句是使用下面的循环语句是使用feof函数判断函数判断fp所指向的文本文所指向的文本文件内容是否结束,若文件内容没有结束,则使用件内容是否结束,若文件内容没有结束,则使用fgetc函数函数继续读取数据。继续读取数据。fgetc将在后面介绍。将在后面介绍。lWhile(!feof(fp)putchar(fgetc(fp);2512.3 文件的定位和检测文件的定位和检测 12.3.3 feof函数和函数和ftell函数函数 2ftell函数函数 ftell函数的使用格式如下:函数的使用格式如下:长整型变量长整型变量=ftell(文件类型指针文件类型指针);ftell函数是用来检测文件内部的位置指针的函数是用来检测文件内部的位置指针的当前位置,若调用成功,当前位置,若调用成功,ftell函数返回值是:函数返回值是:从文件开头到位置指针所指当前位置的总的字从文件开头到位置指针所指当前位置的总的字节数(长整型),否则返回值是节数(长整型),否则返回值是-1L。2612.3 文件的定位和检测文件的定位和检测 12.3.4 ferror函数和函数和clearerr函数函数 1ferror函数函数 ferror函数的使用格式如下:函数的使用格式如下:ferror(文件指针文件指针);ferror函数的功能是检查文件在用各种输入函数的功能是检查文件在用各种输入输出函数进行读写时是否出错。若输出函数进行读写时是否出错。若ferror返回值返回值为为0表示未出错,否则表示有错。表示未出错,否则表示有错。执行执行fopen函函数时,数时,ferror函数的初始值自动置为函数的初始值自动置为0。2712.3 文件的定位和检测文件的定位和检测 12.3.4 ferror函数和函数和clearerr函数函数 2clearerr函数函数 clearerr函数的使用格式如下:函数的使用格式如下:clearerr(文件指针文件指针);clearerr函数的功能是将文件的错误标志和文件结函数的功能是将文件的错误标志和文件结束标志设置为束标志设置为0。若文件发生了输入输出错误,其错误。若文件发生了输入输出错误,其错误标志被置为非标志被置为非0,该值会一直保持到再一次调用输入输,该值会一直保持到再一次调用输入输出函数或者使用出函数或者使用clearerr函数才会改变。函数才会改变。文件刚打开时,文件刚打开时,错误标志为错误标志为0。2812.4 文件的读写文件的读写 12.4.1 fgetc函数和函数和fputc函数函数 1fgetc函数函数 fgetc函数的使用格式如下:函数的使用格式如下:fgetc(文件类型指针);(文件类型指针);fgetc函数的功能是从文件类型指针指向的文本文函数的功能是从文件类型指针指向的文本文件的当前位置读取一个字符,该字符的件的当前位置读取一个字符,该字符的ASCII码值作为码值作为函数的返回值,若读到文件结束符(函数的返回值,若读到文件结束符(z)或读取不成功,)或读取不成功,则返回则返回EOF(-1)。从文件读取一个字符后,文件的当)。从文件读取一个字符后,文件的当前位置将后移一个字节。前位置将后移一个字节。2912.4.1 fgetc函数和函数和fputc函数函数l例如:例如:FILE*fp;char ch;l fp=fopen(“d:yw.txt”,“r”);l ch=fgetc(fp);l表示从表示从fp所指向的文件的当前位置读取一个字符,所指向的文件的当前位置读取一个字符,赋给字符型变量赋给字符型变量ch。lgetchar()与与fgetc(stdin)功能相同,这里的功能相同,这里的stdin代表标准输入文件(如键盘)。这两种形式的作代表标准输入文件(如键盘)。这两种形式的作用都是从终端(如键盘)输入一个字符,函数值用都是从终端(如键盘)输入一个字符,函数值就是该字符。就是该字符。3012.4.1 fgetc函数和函数和fputc函数函数2fputc函数函数 fputc函数的使用格式如下:函数的使用格式如下:fputc(字符表达式,文件类型指针);(字符表达式,文件类型指针);fputc函数的功能是向文件类型指针指向的文本文函数的功能是向文件类型指针指向的文本文件的当前位置写入一个字符,件的当前位置写入一个字符,“字符表达式字符表达式”代表要写代表要写入的字符,字符表达式可以是字符常量或字符变量。若入的字符,字符表达式可以是字符常量或字符变量。若写入成功,则函数的返回值是所写入字符的写入成功,则函数的返回值是所写入字符的ASCII码值,码值,否则返回值为否则返回值为EOF(-1)。向文件写入一个字符后,文)。向文件写入一个字符后,文件的当前位置将后移一个字节。件的当前位置将后移一个字节。3112.4.1 fgetc函数和函数和fputc函数函数例如:例如:FILE*fp;char ch=A;fp=fopen(“d:yw.txt”,“w”);fpuc(ch,fp);表示将存储在变量表示将存储在变量ch中的字符中的字符A写入写入fp所指向所指向的文件的当前位置。的文件的当前位置。putchar(ch)与与fputc(ch,stdout)功能相同,这里功能相同,这里的的stdout代表标准输出文件(如显示器)。这两种形式代表标准输出文件(如显示器)。这两种形式的作用都是向终端(如显示器)输出一个字符。的作用都是向终端(如显示器)输出一个字符。32例例12.2 从键盘输入若干个字符,将其中的小写英文字母写入从键盘输入若干个字符,将其中的小写英文字母写入d盘根盘根目录下名为目录下名为“yw.txt”文本文件中,将其它字符显示在屏幕上,若文本文件中,将其它字符显示在屏幕上,若输入字符输入字符#,则程序结束。,则程序结束。#include int main()FILE*fp;char ch;if(fp=fopen(“d:yw.txt”,“w”)=NULL)printf(“cannot open file!n”);exit(0);ch=getchar();while(ch!=#)if(ch=a&ch=a&ch=A&ch=Z)fputc(ch,fp2);fclose(fp1);fclose(fp2);return 0;3412.4 文件的读写文件的读写 12.4.2 fread函数和函数和fwrite函数函数 1fread函数函数 fread函数的使用格式如下:函数的使用格式如下:fread(buffer,size,count,fp);其中:其中:buffer是存放数据的存储空间的起始地址;是存放数据的存储空间的起始地址;size是数据是数据块的大小(字节数);块的大小(字节数);count是读多少个块;是读多少个块;fp是文件类型指针。是文件类型指针。fread函数的功能是:从函数的功能是:从fp所指向的文件中读取数据块,读取的字所指向的文件中读取数据块,读取的字节数为节数为size*count,读取来的数据存放在,读取来的数据存放在buffer为起始地址的内存为起始地址的内存中。若中。若fread函数的返回值等于函数的返回值等于count,则执行本函数读取数据成,则执行本函数读取数据成功;若文件结束或发生错误,返回值等于功;若文件结束或发生错误,返回值等于0。例如,若已知有例如,若已知有“int a10;”,则下面语句:,则下面语句:fread(a,sizeof(int),10,fp);从从fp所指向的文件中读取所指向的文件中读取2*10个字节(即个字节(即10个整数)存放于数组个整数)存放于数组a中。中。3512.4.2 fread函数和函数和fwrite函数函数2fwrite函数函数fwrite函数的使用格式如下:函数的使用格式如下:fwrite(buffer,size,count,fp);其中四个参数的含义与其中四个参数的含义与fread函数基本相同,只不过现在函数基本相同,只不过现在是将内存中从是将内存中从buffer地址开始的数据往地址开始的数据往fp所指向的文件里写。所指向的文件里写。fwrite函数的的功能是:将内存中从函数的的功能是:将内存中从buffer地址开始的数地址开始的数据往据往fp所指向的文件里写,写入到文件里的字节数为所指向的文件里写,写入到文件里的字节数为size*count。例如,下面语句:例如,下面语句:int b6=1,3,5,7,9,11;fwrite(b,sizeof(int),6,fp);将内存中将内存中b数组的数组的6个元素值(个元素值(2*6个字节)写入个字节)写入fp所指向所指向的文件里。的文件里。36int main()FILE *fp;int i;if(fp=fopen(d:xs.dat,wb)=NULL)printf(Cant open file!);exit(0);for(i=0;iSIZE;i+)/*从键盘输入学生数据*/printf(Input date of No.%d student:n,i+1);printf(num:);scanf(%d,&stui.num);printf(name:);getchar();/*用getchar()来抵消前面的回车符*/gets(stui.name);printf(age:);scanf(%d,&stui.age);for(i=0;iSIZE;i+)/*向文件写入学生数据*/if(fwrite(&stui,sizeof(struct student),1,fp)!=1)printf(File write error!);fclose(fp);return 0;例例12.4 从键盘上输入从键盘上输入10名学生的学号名学生的学号,姓名姓名,年龄,将这些数据写入年龄,将这些数据写入d:xs.dat文件中。文件中。37例例12.5 从上题的d:xs.dat文件中读出所有学生信息,显示在屏幕上。#include#define SIZE 10struct student int num;char name8;int age;stuSIZE;38例例12.5 从上题的从上题的d:xs.dat文件中读出所有学生信息,显示在屏幕上。文件中读出所有学生信息,显示在屏幕上。#include#define SIZE 10struct student int num;char name8;int age;stuSIZE;int main()FILE *fp;int i;if(fp=fopen(d:xs.dat,rb)=NULL)printf(Cant open file!);exit(0);for(i=0;iSIZE;i+)if(fread(&stui,sizeof(struct student),1,fp)!=1)printf(File read error!);else printf(%d,%s,%d n,stui.num,stui.name,stui.age);fclose(fp);return 0;3912.4.3 fscanf函数和函数和fprintf函数函数1fscanf函数函数fscanf函数的使用格式如下:函数的使用格式如下:fscanf(文件类型指针,格式字符串,输入项地址表列文件类型指针,格式字符串,输入项地址表列);fscanf函数的功能是:按函数的功能是:按“格式字符串格式字符串”所指所指定的格式,从定的格式,从“文件类型指针文件类型指针”所指向的文件的当所指向的文件的当前位置读取数据,然后按前位置读取数据,然后按“输入项地址表列输入项地址表列”的顺的顺序,将读取来的数据存入指定的内存单元中。序,将读取来的数据存入指定的内存单元中。fscanf函数的返回值是读取的数据个数;若遇见文函数的返回值是读取的数据个数;若遇见文件结束符或读取不成功,则件结束符或读取不成功,则fscanf函数返回函数返回EOF(-1)。)。4012.4.3 fscanf函数和函数和fprintf函数函数l例如:例如:l fscanf(fp,“%d,%f”,&i,&t););l表示从表示从fp所指向的文件中,按所指向的文件中,按“%d,%f”规定的格式读取规定的格式读取两个值,将这两个值分别存储在地址两个值,将这两个