您好,欢迎访问三七文档
第9章文件文件是C语言程序设计中的一个重要内容。本章主要介绍文件的打开与关闭,文件的读/写以及出错与结束检验。9.1文件的概念在前几章介绍的编程例题中,就曾接触过文件。如存储在项目管理文件夹中的.c源程序文件等。但在程序运行过程中所处理的数据却存储在内存中,程序运行的结果显示在屏幕上,并没有做永久保存。若想记录程序的运行结果,似乎只能用笔写在纸上来记录了。如例6.10-2“学生成绩统计”程序的运行。那么是否有办法将这些数据保存在一个磁盘文件里,供日后使用呢?答案是肯定的。在C语言的编程中,编写的源程序需要以文件的形式保存起来,以便重复利用;各种类型的数据也需要长久保存,以备再利用。这些都涉及到文件的概念。所谓文件,是一组有序的数据集合,诸如一段程序,一批实验数据及一幅图像。C语言文件按信息存放设备分为磁盘文件和设备文件2种。磁盘文件指驻留在外存上的有序的数据集合,包括程序文件(源程序文件、目标文件和可执行文件)及数据文件(指深入/输出数据,诸如一组待处理的原始数据——输入数据,或一组输出的结果——输出数据)。也可以这样说,程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。设备文件是指与主机相连的各种外部设备,诸如标准输入设备——键盘,标准输出设备——显示器,一般输出设备——打印机和绘图仪等。在C语言中,把外部设备看做一个文件来管理,即把输入设备和输出设备等同于磁盘文件的读和写。C语言文件是一种流式文件,总是按照数据写入文件的顺序存放的,因此将文件看成是由一个一个字符(字节)数据顺序组成的序列。从数据的形式上看,文件又分为ASCII码文件和二进制文件2种。ASCII文件在磁盘上存放时,每个字符对应一个字节,用于存放对应的ASCII码。这种文件被称为文本文件。如存储字符a、b、c、d共占4BASCII码01100001011000100110001101100100a(97)b(98)c(99)d(100)每个ASCII码占8位(1B)。ASCII码文件可在显示器上按字符显示,源文件就是ASCII码文件。二进制文件是将内存中的二进制格式数据(数值型数据和字符型数据)按照原来的样子在外存中存储。如数据1234按二进制格式存储为0000010011010010十进制的1234用二进制存储需要用2B,如果将1234按照ASCII码的形式(文本格式)存储,则要占4B,即ASCII码01100001011000100110001101100100十进制数1(49)2(50)3(51)4(52)由此可见,用二进制形式存放数据比用ASCII码文本形式存放数据要节省存储空间。另外对于ASCII码形式的文件进行读取时,要将数字字符串转换为二进制代码;在进行写入时,要将数值型数据的二进制代码转换成该数据的各位数的ASCII码。显然,以二进制形式存取数据可节省代码的转换时间。虽然以二进制形式读取数据可节省存储空间和转换时间,但是一个字节并不对应一个字符,不能直接输出字符形式。一般地,对于中间结果数据需要暂时存放在外存,以后又需要调入内存的情况,常用二进制保存;用ASCII形式输出,与字符一一对应,一个字节代表一个字符,便于对字符进行逐个处理,也便于输出字符。但是一般占存储空间多,需要花费转换时间。C语言在处理文件时,不区分数据类型,把数据看成有序的字符(字节)序列(流),文件的存取是以字符(字节)为单位的,按字节来进行处理。输入/输出字符流的开始和结束,只由程序控制,而不受物理符号(如【回车】0D、【换行】0A)控制,所以一个C文件是一个字节流或二进制流,因此把这种文件称为流式文件,简称流文件。对文件的处理方法,ANSIC标准采用缓冲文件系统。所谓缓冲文件系统,是指系统为每一个正在使用的文件名自动地在内存区划出一片缓冲区域,称为缓冲区。从内存向磁盘输出数据时,必须先送到内存中的缓冲区,缓冲区装满后,一起存入磁盘;从磁盘向内存读取数据时,则一次从磁盘文件将一批数据送到内存缓冲区,将缓冲区装满,然后再从缓冲区逐个地将数据送到程序数据区,传送给程序变量。缓冲区的大小,由C版本而定,一般为512B。ANSIC既用缓冲文件处理文本文件,也用缓冲文件系统处理二进制文件。缓冲区读/写示意见图9.1-1所示。对文件的读写都是用库函数来完成。这类库函数的功能可分为3种:其一,打开和关闭文件函数,打开文件函数为fopen(),关闭文件函数为fclose();其二,文件的读写函数,按处理文件中数据的方式,可分为按字符读/写、按格式读/写和按二进制读/写等诸种函数;其三,文件指针管理函数,如读/写指针归位函数rewind()、读/写指针定位函数fseek()、读/写指针位置函数ftell()、文件出错检测函数ferror()以及文件结束检测函数feof()等。9.2文件指针文件指针是指指向文件的指针变量。一个文件指针指向某个文件是指该指针指向了该文件内存缓冲区的首地址。通过文件指针可对其所指向的文件进行操作。定义文件指针的一般格式为FILE*指针变量名;如FILE*fp;其中大写FILE是系统提供的文件类型说明符。它是一个结构体,含有文件名、文件状态和文件当前位置等信息。它被存放在头文件stdio.h中。其结构体的各成员为typedefstruct磁盘内存数据区域输入文件缓冲区输出文件缓冲区RAM图9.1-1文件读取缓冲区示意图{sgortlevel;/*fill/emptylevelofbuffer*/unsignedflags;/*filestatusflags*/charfd;/*filedescriptor*/unsignedcharhold;/*ungetccharifnobuffer*/shortbsize;/*buffersize*/unsignedchar*buffer;/*datatransferbuffer*/unsignedchar*curp;/*currentactivepointer*/unsignedistemp;/*temporaryfileindicator*/shorttoken;/*usedforvaliditychecking*/}FILE;/*thisisthefileobject*/这些数据分别描述文件的下列信息:缓冲区满或空的程度、文件状态标志、文件描述符、如无缓冲区不读入字符、缓冲区大小、缓冲区的位置、当前活动指针的位置、临时文件指示器、用于有效性检查。用FILE*fp;定义了一个指向FILE类型结构体的指针变量,被统称为指向一个文件的指针。就意味着系统开辟一个FILE结构的空间,用文件指针fp指向它。通过fp可在缓冲区找到存放某个文件信息的结构体变量,按结构体变量提供的信息,找到该文件,可对文件进行操作。注意♣此时的fp指向的FILE结构还未与任何文件建立联系,必须调用fopen函数为文件指针和要操作的存储在磁盘上的文件建立联系。9.3文件的打开与关闭要对文件进行读/写操作,必须先打开文件;读/写结束后,若不再使用该文件,则应关闭文件,在C语言中,文件操作是由函数实现的。本节介绍文件的打开与关闭函数。9.3.1文件的打开打开文件使用文件打开函数fopen()。它的调用方法的一般格式为文件指针名=fopen(文件名,使用文件方式);如FILE*fp;fp=fopen(“filename.c”,“r”);其中文件指针名(fp)必须说明为FILE类型的指针变量;文件名(filename.c)是要打开的文件名字,包括文件名和扩展名,命名规则与变量相同;使用文件方式(r)是说明使用者对文件的操作方式,r表示读入;函数fopen()的返回值为,若能正确打开指定的文件(filename.c),函数带回指向文件filename.c的指针(地址)并赋值给fp,这样fp和文件filename.c联系起来了,或者说fp指向filename.c。使用文件的方式如表9.3-1所列。表9.3-1使用文件方式使用文件方式含义“r”(只读)打开文本文件,只能用于读取数据“w”(只写)打开文本文件,只能用于写入数据对表9.3-1的使用文件方式作如下说明:♣用r方式打开一个文件,只能读出,不能写入,而且该文件必须存在;否则出错,返回NULL。♣用w方式打开的文件,只能写入,不能读出。如果要打开的文件不存在,则以指定的文件名建立该文件并打开它;如果原来已存在该文件名的文件,则在打开时将该文件清除,重新建一个新文件。♣用a方式打开文件,可向文件末尾添加新的数据(不清除原来的数据)。如果文件不存在,则以指定文件名建新文件。♣用r+、w+、a+方式打开文件时,既可以读,也可以写。用r+方式打开文件时,该文件必须已经存在,否则出错。用w+方式打开文件时,可先向文件写入数据,然后可以读取该文件的数据。用a+方式打开文件时,该文件不被删除,文件指针移到文件末尾,可添加新的数据,也可由文件头读出。若文件不存在,则建立一个新的文件。♣在打开文件时,如果出错,则函数fopen()返回一个空指针值NULL(NULL已经在stdio.h中被定义为0)。在程序中可利用这一信息,判断是否完成了打开文件的工作,并做相应的处理。常用以下程序段打开文件。if((fp=fopen(“myfile”,”r”))==NULL){printf(“Can’topenthisfile!\n”);exit(0);}这段程序的含义是,先检查打开操作是否出错,如果返回的指针为空,则表示出错。如果出错,则在显示器上输出“Can’topenthisfile!”。函数exit(0);的作用是关闭所有已打开的文件,终止当前程序的运行,将交由系统处理退出程序,待用户检查出错误,修改后再运行。使用exit(0)函数必须在程序中包含stdlib.h头文件,即标准库文件。在每个C语言程序运行时,系统会自动地打开3个标准文件:标准输入(键盘)、标准输出(显示器)及标准出错输出(显示器),可直接使用。C语言把输入/输出设备都当作文件,对它的处理方式与处理磁盘文件相同。在前面的章节中,对输入/输出数据并未进行打开文件的操作,但实际上都执行了打开文件的操作,因为这3个标准文件都与终端像联系。3个标准设备名称对应的文件指针为标准输入设备(键盘):stdin;标准输出设备(显示器):stdout;标准错误输出设备(显示器):stderr。程序中可直接使用文件指针来处理3个标准设备文件,使用后也不用关闭,在退出系统时,系统将自动关闭这3个设备文件。“a”(追加)打开文本文件,在文件尾部添加数据“rb”(只读)打开二进制文件,只能用于读取数据“wb”(只写)打开二进制文件,只能用于写入数据“ab”(追加)打开二进制文件,在文件尾部添加数据“r+”(读/写)为读/写打开一个文本文件“w+”(读/写)为读/写打开或建立一个新的文本文件“a+”(读/写)为读/写打开一个文本文件,或在文件尾部添加数据“rb+”(读/写)为读/写打开一个二进制文件“wb+”(读/写)为读/写打开或建立一个新的二进制文件“ab+”(读/写)为读/写打开一个二进制文件,或在文件尾部添加数据9.3.2文件的关闭关闭文件使用文件的关闭函数fclose()。使用完一个文件,就应该关闭它,以防止文件数据的丢失、损坏、或误用。关闭就是使文件指针变量不再指向该文件。执行这个函数,就会把留在缓冲区里的内容都传给文件,然后释放该文件的内存缓冲区,关闭文件。这样就避免了缓冲区中由于结束程序运行而丢失数据的可能。函数fclose()调用的一般格式为fclose(文件指针);如fclose(fp);此语句表示在先前打开文件(使用fopen()函数)时,函数带回指针(地址)并赋给fp,此刻,又通过fp把该文件关闭,即指针变量fp不再指向该文件。函数fclose()带回一个值。当正常地完成关闭文件的操作时,返回值为0;否则返回EOF(-1),表示发生错误了,也可以用函数ferror()来测试(见9.6.1小节)。9.4文件的读/写打开文件之后,就要对其进行读/写。
本文标题:第9章C语言
链接地址:https://www.777doc.com/doc-2199692 .html