程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章

上传人:E**** 文档编号:89388708 上传时间:2019-05-24 格式:PPT 页数:73 大小:431.50KB
返回 下载 相关 举报
程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章_第1页
第1页 / 共73页
程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章_第2页
第2页 / 共73页
程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章_第3页
第3页 / 共73页
程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章_第4页
第4页 / 共73页
程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章》由会员分享,可在线阅读,更多相关《程序设计基础 教学课件 ppt 作者 C语言 7-10章 第10章(73页珍藏版)》请在金锄头文库上搜索。

1、第10章 文 件,10.1 文件概述 10.2 文件的读写 10.3 文件定位 习题,10.1 文 件 概 述 文件(file)是程序设计中一个重要的概念。所谓“文件”,一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据,也必须先建立一个文件(以文件名标识),才能向它输出数据。,以前各章中所用到的输入和输出都是以终端为对象的,即从键盘输入数据,运行结果输出到显示屏上。从操作系统的角度看,每一个与主机相

2、连的输入/输出设备都可看做是一个文件。例如,终端键盘是输入文件,显示屏和打印机是输出文件。 在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这就要用到磁盘文件。,C语言把文件看做是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成的。根据数据的组织形式,文件可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。有一个整数10 000,在内存中占2个字节,如果按ASCII码形

3、式输出,则占5个字节,而按二进制形式输出,在磁盘上只占2个字节,见图10-1。,用ASCII码形式输出与字符一一对应,一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符,但一般占存储空间较多,而且要花费转换时间(二进制形式与ASCII码间的转换)。用二进制形式输出数值,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,以后又需要输入到内存的,常用二进制文件保存。,图10-1 数据的存储形式,由前所述,一个C文件是一个字节流或二进制流。它把数据看作是一连串的字符(字节),而不考虑记录的界限。换句话说,C语言中文件并不

4、是由记录(record)组成的(这是和Pascal或其他高级语言不同的)。在C语言中对文件的存取是以字符(字节)为单位的。输入/输出的数据流的开始和结束仅受程序控制,而不受物理符号(如回车换行符)控制。也就是说,在输出时不会自动增加回车换行符以作为记录结束的标志,输入时不以回车换行符作为记录的间隔(事实上C文件并不由记录构成)。我们把这种文件称为流式文件。C语言允许对文件存取一个字符,这就增加了处理的灵活性。在过去使用的C版本(如UNIX系统下使用的C)中有两种对文件的处理方法:一种叫“缓冲文件系统”,另一种叫“非缓冲文件系统”。,所谓缓冲文件系统,是指系统自动地在内存区为每一个正在使用的文件

5、名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。缓冲文件系统如图10-2所示。缓冲区的大小由各个具体的C版本确定,一般为512字节。,图10-2 缓冲文件系统示意图,所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。 在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统处理二进制文件。用缓冲文件系统进行的输入/输出又称为高级(或高层)磁盘输入/输出(高层I/O)

6、,用非缓冲文件系统进行的输入/输出又称为低级(低层)输入/输出。ANSI C标准规定不采用非缓冲文件系统,而只采用缓冲文件系统,即用缓冲文件系统处理文本文件,也用它来处理二进制文件,也就是将缓冲文件系统扩充为可以处理二进制文件。,在C语言中,没有输入/输出语句,对文件的读写都是用库函数来实现的。ANSI规定了标准输入/输出函数,可用它们对文件进行读写。 本章只介绍ANSI C规定的文件系统以及对它的读写。 10.1.1 文件和文件指针 缓冲文件系统中,关键的概念是“文件指针”。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存

7、在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。Turbo C在stdio.h文件中有以下的文件类型声明:,typedef struct shortlevel; /*缓冲区“满”或 “空”的程度*/ unsigned flags; /*文件状态标志*/ charfd; /*文件描述符*/ unsigned charhold; /*如无缓冲区则不读取字符*/ shortb size; /*缓冲区的大小*/ unsigned char*buffer; /*数据缓冲区的位置*/ unsignedar *curp; /*指针,当前的指向*/ unsigned istemp; /*临时

8、文件,指示器*/ short token; /*用于有效性检查*/ FILE;,有了结构体FILE类型之后,就可以用它来定义若干个FILE类型的变量,以便存放若干个文件的信息。例如,可以定义以下FILE类型的数组: FILE f5; 定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。 可以定义文件型指针变量。如: FILE *fp;,fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。如果有n个文件,一般应设n个指针变量(指向FILE类型结构体的指针变

9、量),使它们分别指向n个文件(确切地说,是指向存放该文件信息的结构体变量),以实现对文件的访问。,注意: (1) 由于文件类型FILE在头文件stdio.h中定义,所以在使用FILE类型前必须先打开stdio.h文件。 (2) 如果需要对某一个文件进行读写操作,则必须首先指定指向它的文件指针。只有通过文件指针,才能调用相应的文件。当程序需要同时处理多个文件时,则需要说明多个FILE型的指针变量,使它们分别指向多个不同的文件。,10.1.2 文件操作的一般过程 使用文件的一般步骤如下:打开文件操作文件关闭文件。 (1) 打开文件:建立用户程序与文件的联系,系统为文件开辟文件缓冲区。 (2) 操作

10、文件:是指对文件的读、写、追加和定位操作。 读操作:从文件中读出数据,即将文件中的数据输入到计算机内存。 写操作:向文件中写入数据,即将计算机内存中的数据输出到文件。, 追加操作:将新的数据写到文件原有数据的后面。 定位操作:移动文件读写位置指针。 (3) 关闭文件:切断文件与程序的联系,将文件缓冲区的内容写入磁盘,并释放文件缓冲区。,10.1.3 文件的打开与关闭 和其他高级语言一样,对文件读写之前应该“打开”该文件,在使用结束之后应关闭该文件。 1文件的打开(fopen函数) ANSI C规定了标准输入/输出函数库,用fopen( )函数来实现打开文件。 fopen函数的调用方式通常为:

11、FILE *fp; fp=fopen(文件名,使用文件方式); 例如: fp=fopen(“a1“,“r“);,它表示要打开名字为a1的文件,使用文件方式为“读入” (r代表read,即读入)。fopen函数带回指向a1文件的指针并赋给fp,这样fp就和文件a1相联系了,或者说,fp指向a1文件。可以看出,在打开一个文件时,通知给编译系统以下3个信息: 需要打开的文件名,也就是准备访问的文件的名字。 使用文件的方式(“读”还是“写”等)。 让哪一个指针变量指向被打开的文件。,说明: (1) 用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在。不能用“r

12、”方式打开一个并不存在的文件(即输入文件),否则出错。 (2) 用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。 (3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件末尾。,(4) 用“r+”、“w+”、“a+”方式打开的文件既可以用来输入数据,也可以用来输出数据。用“r+”方式时,该文件应该已经存在,以便

13、能向计算机输入数据;用“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据;用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。 (5) 如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满,无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义为0)。常用下面的方法打开一个文件:,if (fp=fopen(“file1“,“r“)=NULL) printf(“cannot open this filen“)

14、; exit(0); ,即先检查打开的操作有否出错,如果有错就在终端上输出“cannot open this file”。exit函数的作用是关闭所有文件,终止正在调用的过程。待用户检查出错误,修改后再运行。 (6) 用以上方式可以打开文本文件或二进制文件,这是ANSI C的规定,用同一种缓冲文件系统来处理文本文件和二进制文件。但目前使用的有些C编译系统可能不完全提供所有这些功能(例如有的只能用“r”、“w”、“a”方式),有的C版本不用“r+”、“w+”、“a+”,而用“rw”、“wr”、“ar”等,请读者注意所用系统的规定。,(7) 在向计算机输入文本文件时,将回车换行符转换为一个换行符;

15、在输出时,把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。 (8) 在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出。通常这3个文件都与终端相联系。因此以前所用到的从终端输入或输出都不需要打开终端文件。系统自动定义了3个文件指针stdin、stdout和stderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。如果程序中指定要从stdin所指的文件输入数据,就是指从终端键盘输入数据。,2文件的关闭(fclose函数) 在使用完一个文件后应该关闭它,以避免数据丢失。“

16、关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作。(除非再次打开,使该指针变量重新指向该文件。)用fclose函数关闭文件。fclose函数调用的一般形式为: fclose(文件指针); 例如: fclose(fp);,前面曾把打开文件(用fopen函数)时所带回的指针赋给了fp,现在通过fp把该文件关闭。即fp不再指向该文件。 应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将会引起数据丢失。如前所述,在向文件写数据时,是先将数据输到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号