资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章文件管理,本章要点 8.1 文本文件的访问 8.2 成 绩 记 录 8.3 成 绩 查 询 习题 8,8.1 文本文件的访问,8.1.1 文件的基本概念 程序执行时,所有的数据都存储在计算机内存中。这些数据只能临时存放,要想永久保存就需要把数据存放到外存储器(如磁盘)中。存储在外存储器中的数据是以文件的形式存放的,每个文件都有一个名字(文件名)以便于识别。因此,文件是指存储在外部介质上的数据集合。 数据文件是程序设计中的重要概念。程序可以通过文件操作存取数据,因此文件的输入输出是文件最基本的操作。要输入已存在的数据文件中的数据,必须先按文件名打开文件,然后从该文件读取数据;而要输出数据到文件中,必须先按给定文件名建立文件,然后才能向该文件写入数据。 C语言把文件看作是一个字符(字节)的序列,即由一个个字符(字节)的数据顺序组成。根据数据的组织形式,分为文本文件和二进制文件。,8.1 文本文件的访问,1文本文件 文本文件的每个字节放一个ASCII,代表一个字符(例如:整数1234占用4个字节),文本文件也称为ASCII文件。文本文件的输出与字符一一对应,因此它便于对字符进行逐个处理,也便于输出字符。 文本文件由文本行组成,每行可以由零个字符或多个字符组成,并以换行符n结束。文本文件的结束标志是0x1A。在使用文本文件向计算机输入时,将回车换行符(r和n)转换为一个换行符n;而在输出时把换行符转换为回车符和换行符。 2二进制文件 二进制文件是把内存中的数据按其在内存中的组织形式原样地输出到磁盘文件中。这时,不能直接输出字符形式,一个字节并不对应一个字符(例如:整数1234占用2个字节)。由此可见,二进制文件的一个优点是节省外存空间。 二进制文件不需要在二进制形式与ASCII之间进行转换,并且二进制文件不能像文本文件那样,在回车换行符和换行符之间进行转换。因此,二进制文件的另一个优点是减少转换时间,提高读写速度。,8.1 文本文件的访问,8.1.2 文件与指针 在C语言中,对文件的访问是通过文件指针来实现的,因此,弄清楚文件与文件指针的关系,对于学习文件的访问非常重要。 1文件类型指针 C语言中,有一个FILE类型,它是存放文件有关信息的结构体类型。FILE对于文件来说十分重要,它可以用于定义文件类型指针变量。例如: FILE *fp; FILE类型结构在stdio.h中定义,内容如下:,8.1 文本文件的访问,typedef struct short level; /*记录打开文件流的缓冲区填入数据的情况 */ unsigned flags; /* 文件状态标志 */ char fd; /* 与文件关联的标识符,即文件句柄 */ unsigned char hold; /* 缓冲区为空(level=0)时,由ungetc( ) 函数回退到输入流中的字符*/ short bsize; /* 文件缓冲区大小,默认为512字节 */ unsigned char *buffer; /* 文件缓冲区指针 */ unsigned char *curp; /* 当前激活的文件指针 */ unsigned istemp; /* 临时文件标识 */ short token; /* 用于文件夹有效性检查 */ FILE; 通过文件类型指针变量(简称文件指针变量或文件指针),能够利用打开文件操作找到与它相关的文件。对于已打开的文件进行输入输出操作都是通过指向该文件结构体的指针变量进行的。,8.1 文本文件的访问,2设备文件 C语言中把所有的外部设备都作为文件看待,这样的文件称为设备文件。C语言中常用的设备文件名如下: CON或 KYBD: 键盘 CON或 SCRN: 显示器 PRN或 LPT1: 打印机 AUX或 COM1: 异步通信口 另外,在程序开始运行时系统自动打开三个标准设备文件与终端相联系。它们的文件结构体指针的命名与作用如下: stdin 标准输入文件结构体指针(系统分配为键盘) stdout 标准输出文件结构体指针(系统分配为显示器) stderr 标准错误输出文件结构体指针(系统分配为显示器),8.1 文本文件的访问,8.1.3 文件系统 1流(Stream) 如前指出,流是程序输入或输出的一个连续的数据序列,常用设备(键盘、显示器和打印机等)的输入输出都是通过流来处理的。在C语言中,所有的流均以文件的形式出现,包括设备文件。流实际上是文件输入输出的一种动态形式,C文件就是一个字节流或二进制流。 流作为连续数据序列不是由记录组成的。C文件输入输出的字节流或二进制流仅受程序控制而不受物理符号(如回车换行符)控制。也就是说,文件输入输出时不会考虑记录的界限。这种文件通常可以称为流文件。 2文件系统 图8-1 缓冲文件系统 在C语言中有两种处理文件的方法,一是“缓冲文件系统”;二是“非缓冲文件系统”。所谓“缓冲文件系统”是指系统自动在内存区为每个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到缓冲区,待缓冲区装满后才送到磁盘。如果从磁盘读入数据,则一次从磁盘将一批数据输入到内存缓冲区,然后再依次从缓冲区将数据送到程序数据区,赋给程序变量,如图8-1所示。缓冲区的大小由各具体的C版本确定,一般为512字节。 所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。ANSI C标准规定采用缓冲文件系统。 在C语言中,没有文件的输入输出语句,对文件的读写都必须用库函数来实现,它们集中在stdio.h头文件中。,8.1 文本文件的访问,缓冲区的大小由各具体的C版本确定,一般为512字节。 所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。ANSI C标准规定采用缓冲文件系统。 在C语言中,没有文件的输入输出语句,对文件的读写都必须用库函数来实现,它们集中在stdio.h头文件中。,图8-1 缓冲文件系统,8.1 文本文件的访问,8.1.4 文件的访问 在读/写文件之前必须先“打开”文件,在使用完毕之后必须关闭该文件。 1文件的打开 通过数据文件向程序提供已知数据或者将程序处理的中间结果或最后结果存储在数据文件中都要先打开文件。 打开文件的fopen( )函数的一般格式如下: FILE *fp; fp = fopen( 文件名, 文件方式 ); 其中,fopen( )是打开文件的函数;fp是一个文件指针;“文件名”是一个DOS文件名;“文件方式”是打开文件的方式,其取值及含义如表8-1所示。,8.1 文本文件的访问,下面的语句表示要打开名为abc的文件,使用的文件方式为“读入”。 fp= fopen(“abc“,“r“); fopen( )函数返回指向abc文件的指针并赋值给fp,因此fp就和abc文件建立了关联,即fp指向abc文件。可以看出,打开一个文件时,向系统提供了下列3个信息:准备访问的文件名;使用的文件方式(“读”、“写”还是“增补”等);用哪个指针变量指向被打开的文件。 如果fopen函数不能完成打开指定的文件,它将返回一个空指针值NULL。出现这种情况的原因可能是:用“r“方式打开不存在的文件;产生磁盘故障;磁盘已满无法建立新文件等。因此常用条件 (fp=fopen(“abc.txt“,“r“)=NULL 来判断出错信息。 2文件的关闭 文件使用完毕之后必须关闭它。 关闭文件需要使用fclose( )函数,它的一般使用格式如下: fclose( fp ); 其中,fclose( )在关闭文件前先清除文件缓冲区,若关闭成功返回0,否则返回EOF(-1)。fp是已定义过的文件指针。,8.1 文本文件的访问,3文件访问函数 文件访问包括数据的输入与输出,输入是指通过数据文件向程序提供已知数据,而输出是指将程序处理的中间结果或最后结果存储在数据文件中。 (1)字符输入函数fgetc( ) 从文件读一个字符使用fgetc( )函数。 fgetc( )函数的一般格式如下: char c = fgetc( fp ); 其中,fp是已定义过的文件指针;该函数从fp指向的文件中读取一个字符,并将它转换为一个字节值保存在“字符变量c”中。当读到文件末尾或出错时,该函数返回一个文件结束标志EOF(-1)。因为字符的ASCII为非负值,所以可用EOF(-1)作为结束标志,即当读入的字符值等于-1时表示文件已结束。 (2)字符输出函数fputc( ) fputc( )函数的一般格式如下: fputc( 字符c , fp ); 其中,fp是已定义过的文件指针。该函数把一个字节的代码值c写入fp指向的文件中。,8.1 文本文件的访问,(3)字符串输入函数fgets( ) fgets( )函数的一般格式如下: fgets( 字符串变量, 字符个数n , fp ); 其中,fp是已定义过的文件指针。该函数从fp指向的文件中读取n个字符,并将它们保存在“字符串变量”参数指定的缓冲区中。当下列情况出现时,读写过程结束: 读取了少于n个字符; 当前读取的字符是回车符; 已读到文件末尾。 (4)字符串输出函数fputs( ) fputs( )函数的一般格式如下: fputs( 字符串变量 , fp ); 其中,fp是已定义过的文件指针。该函数将“字符串变量”的数据写到fp指向的文件中。出错时返回文件结束标志EOF(-1)。,8.1 文本文件的访问,4文件检测函数 在文件的访问中有时会出现错误,例如,不能打开指定的文件、文件不存在等。此时,可以使用检测文件错误的函数进行检测。 (1)ferror( )函数 ferror( )是文件读写错误的检测函数,它的一般格式如下: ferror( fp ); 其中,fp是已定义过的文件指针。该函数返回0值表示未出错,返回非0值表示出错。 (2)clearerr( )函数 clearerr( )函数用于清除文件错误标志,它的一般格式如下: clearerr( fp ); (3)feof( )函数 feof( )函数用于文件结束检测。对于文本文件,通常可用EOF(-1)作为结束标志;但对于二进制文件,-1可能是字节数据的值。为了正确判定文件的结束,可以通过使用feof( )函数来完成,它的一般格式如下: feof( fp ); 其中,fp是已定义过的文件指针。该函数用于检测文件是否结束。若结束返回非0值;否则返回0值。,8.2 成 绩 记 录,8.2.1 二进制文件的访问 对文件按二进制格式进行访问,可以获得比文本文件更高的灵活性,能访问不同类型的文件。在打开文件时如果使用了参数“b”,就可以以二进制格式打开文件。C语言提供了函数以支持对二进制文件的访问。 (1)格式化输入函数fscanf( ) fscanf( )函数的一般格式如下: fscanf( fp, 格式字符串, 地址项列表 ); 其中,fp是已定义过的文件指针。该函数从fp指向的文件中读取格式化数据,而参数“格式字符串”和“地址项列表”的用法与scanf语句相同。 (2)格式化输出函数fprintf( ) fprintf( )函数的一般格式如下: fprintf( fp, 格式字符串, 输出项列表 ); 其中,fp是已定义过的文件指针。该函数将格式化数据写到fp指向的文件中,而参数“格式字符串”和“输出项列表”的用法与printf语句相同。,8.2 成 绩 记 录,(3)数据块输入函数fread( ) fread( )函数的一般格式如下: fread( 内存起始地址, 项大小, 项数, fp ); 其中,fp是已定义过的文件指针。该函数从fp指向的文件中读取若
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号