C程序设计 第二版 教学课件 ppt 作者 荣政_ 第10章

上传人:E**** 文档编号:89343485 上传时间:2019-05-23 格式:PPT 页数:66 大小:381KB
返回 下载 相关 举报
C程序设计 第二版 教学课件 ppt 作者 荣政_ 第10章_第1页
第1页 / 共66页
C程序设计 第二版 教学课件 ppt 作者 荣政_ 第10章_第2页
第2页 / 共66页
C程序设计 第二版 教学课件 ppt 作者 荣政_ 第10章_第3页
第3页 / 共66页
C程序设计 第二版 教学课件 ppt 作者 荣政_ 第10章_第4页
第4页 / 共66页
C程序设计 第二版 教学课件 ppt 作者 荣政_ 第10章_第5页
第5页 / 共66页
点击查看更多>>
资源描述

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

1、第十章 文件,10.1 文件概述 10.2 文件的打开与关闭 10.3 文件的读/写 10.4 文件的定位 10.5 程序设计举例 习题,10.1 文件概述 10.1.1 文件的概念 磁盘文件在DOS管理中被定义为存储在外部介质上的程序或数据的集合,是一批逻辑上有联系的数据(如一个程序、一批实验数据、一篇文章或一幅图像等)。每个文件都有一个文件名作为标识,每个文件在磁盘中的具体存放位置、格式都由操作系统中的文件系统管理,也就是说,操作系统是以文件为单位对程序或数据进行管理的。我们最熟悉的是编辑后存于磁盘上的源程序文件*.C,经编译后得到的目标文件*.OBJ,连接之后形成的可执行文件*.EXE等

2、。我们只需告诉操作系统一个文件名,就可利用DOS命令或Windows 的资源管理器对文件进行读、写、删除、拷贝、显示或打印等工作。,在C语言中文件的含义更为广泛,不仅包含以上所述的磁盘文件,还包括一切能进行输入/输出的终端设备,它们被看成是设备文件。如键盘常称为标准输入文件,显示器称为标准输出文件。 文件是由磁盘文件和设备文件组成的。作为磁盘文件之一的数据文件是本章学习的主要对象。数据文件可以看做是C中最后一种数据类型,是C语言重要的组成部分。,根据文件内数据的组织形式,文件可分为文本(text)文件和二进制文件。文本文件又称为ASCII码文件,它的每一个字节存放一个字符的ASCII码。ASC

3、II码文件便于字符处理,也便于字符输出,但占用存储空间较多,而且要花费转换时间(内存中的二进制形式与ASCII码之间的转换); 二进制文件的每一个字节是真正的二进制数,也就是把内存中的存储形式原样存放在磁盘上。二进制文件可以节省存储空间,但不能直接输出字符形式。一般中间数据结果常用二进制文件保存。因数据的组织形式不同,两种文件在读/写时有一些差异要注意。,10.1.2 数据流 在使用 C 语言编写应用程序时,也可以利用操作系统来处理以文件形式存放在磁盘上的数据。操作系统直接管理文件时,一般是将文件作为一个整体来处理的,例如拷贝文件、删除文件等,而用C编写的应用程序往往要对文件的内容进行处理。文

4、件的内容可能千变万化,文件的大小也各不相同,那么如何处理文件中的数据呢? 为此,C语言的输入/输出系统引入了“流”(stream)的概念:在编程者和文件(包括终端设备)之间提供了一种抽象的概念数据流,这也是基于Windows编程(进行输入/输出)的基本概念,所以要深入理解数据流的概念。,数据流是对数据输入/输出(I/O)行为的一种抽象。各种各样的终端设备或磁盘文件的细节是非常复杂多样的(例如磁盘文件既允许顺序存取,又允许随机存取,而作为终端的设备文件就只能顺序存取),直接对它们编程将会非常繁琐。引入数据流的概念有效地解决了这一难题。只要建立了输入/输出数据流,编程者在应用程序中就不需要关心底层

5、输入/输出设备或是任何磁盘文件的具体细节差异。程序中要输入数据,只需从输入数据流中读入; 输出数据只需向输出数据流中写出即可,这样就使程序完全与具体硬件资源脱离了关系,也就是说数据流使C程序与具体系统完全不相关,使C程序可以非常方便地移植。,数据流可分为文字流和二进制流。 一个文字流是一行行的字符,换行符表示这一行的结束。文字流中某些字符的变换由环境工具的需要来决定。例如一个换行符可以变换为回车换行两个字符。因此所读/写的字符与外部设备中的数据没有一一对应的关系。 一个二进制流是由与外部设备中的数据一一对应的一系列字节组成的。使用中没有字符翻译过程,而且所读/写的字节数目也与外部设备中的数目相

6、同。,在一个程序开始执行时,三个预定义的文字流:stdin(标准输入)、stdout(标准输出)和stderr(标准出错)就被打开,有的系统还同时打开stdprn(标准打印机)和stdaux(标准辅助设备,大多数系统是控制台)。 对编程人员来说,所有的I/O通过流来进行。所有的流都一样,都是一系列字符。文件I/O系统把流与文件,也就是与有I/O功能的外部设备连接起来。C语言的I/O库函数把来自设备的源信息转换到流之中,或反过来把流中的信息转换给各设备。在C语言中,编程者只需记住流这个概念,只使用一个文件系统就可以完成全部的I/O操作。,10.1.3 C的文件系统及其与流的关系 C的文件系统可分

7、为缓冲文件系统和非缓冲文件系统两类。所谓缓冲文件系统,又称高级磁盘输入/输出系统。在调用这种文件处理函数时,会自动在用户内存区中为每一个正在使用的文件划出一片存储单元,称为开辟一个缓冲区。,设立缓冲区的原因是磁盘的读/写速度比内存的处理速度要慢很多,而且磁盘驱动器是机电设备,定位精度比较差,所以磁盘数据存取要以扇区(磁盘上某磁道中的一个弧形段,通常存放固定数量的数据)或者簇(由若干扇区组成)为单位。这样就要求有一个缓冲区来作为文件数据输入/输出的中间站来协调:从磁盘文件中读取数据时,先将含有该数据的扇区或簇从磁盘文件以慢速读到缓冲区中,然后再从缓冲区将数据快速送到应用程序的变量中去。下次再读数

8、据时,首先判断缓冲区中是否还有数据,如果有,则直接从缓冲区中读,否则就要从磁盘中再读另一个扇区或簇。向磁盘中写数据也一样,数据总是先从内存写入缓冲区中,直到缓冲区写满之后才一起送到磁盘文件中。,前面学过的getchar()函数是类似的缓冲输入方式,读者可参考第三章中的相应程序单步跟踪其执行过程,体会缓冲文件的实质。 非缓冲文件系统又称为低级磁盘输入/输出系统。系统不为这类文件自动提供文件缓冲区,文件读/写函数也与缓冲文件系统不同。因其不是ANSI C规定的范围,又用得不多,故本书只介绍缓冲文件系统的有关知识。 C语言中将缓冲文件看成是流式文件,即无论文件的内容是什么,一律看成是由字符(文本文件

9、)或字节(二进制文件)构成的序列,即字符流。流式文件的基本单位是字节,磁盘文件和内存变量之间的数据均以字节为基础。若实际数据的划分是结构体类型的数据块,可通过一次读/写多个字节来实现。,流式文件的好处也就是应用数据流的好处,即对各种文件编程时不必去关心具体设备的复杂情况或各种磁盘文件的具体格式,只需单纯地与数据流交换数据即可达到与各种具体设备交换数据或处理各种具体文件的目的。具体地讲,读一个字符即是从数据流中拷贝一个字符到内存中; 写一个字符,就是将内存中的一个字符拷贝到数据流中。至于数据真正从何处“流”来或“流”向何处, 编程者只需在程序的最初将数据流与具体的硬件资源或磁盘文件联系起来即可确

10、定,其后的具体操作中编程者只需调用读/写函数,而不必考虑具体设备或文件间的差异。这样非常有利于编出统一的、易移植的程序。,例如,我们从一开始学的输入/输出函数,为什么可以直接调用scanf()函数从键盘读入数据,调用printf()函数就可以在CRT上显示数据呢?程序里没有任何参数提及键盘或显示器,这是因为程序运行之初即自动打开三个文件将数据流定向于键盘和显示器(这是系统的缺省设置),这样应用程序就可以直接实现从键盘输入数据或向显示器输出数据了。 磁盘文件不同于设备文件之处在于必须在程序中调用打开函数来打开文件,即用一个文件打开操作使数据流和一个特定的文件发生联系。一旦一个文件被正确打开,应用

11、程序就可以通过一个数据流与该文件之间交换信息。完成任务后,应用程序又必须关闭文件,即用一个文件关闭操作切断数据流与磁盘文件间的联系,也就是使数据流脱离一个具体的文件。,10.1.4 文件指针 一般缓冲文件操作有三个必需的步骤: (1) 在使用文件前要调用打开函数将文件打开,若打开失败,则返回一个空指针;若打开正常,可以得到一个文件指针,并利用它继续对文件操作。 (2) 可调用各种有关函数,利用该指针对文件进行具体处理,一般要对文件进行读或写操作。 (3) 在文件用完时,应及时调用关闭函数来关闭文件,切断数据流,防止数据遗失或误操作破坏文件内容。 缓冲文件系统中,关键的概念是文件指针。,通常,由

12、于文件中的数据很多,因此读/写时应该指明对哪个数据进行操作。流式文件中采用的方法是设立一个专门用来存放文件读/写位置的变量,称为当前工作指针。在对某文件开始进行操作时,将当前工作指针的值设置为0,表示文件从头开始读(写); 每次读(写)之后,自动将当前工作指针的值加上本次读(写)的字节数,作为下次读(写)的位置。从前面的介绍可以看出,要对一个文件进行操作,除了要设当前工作指针,还必须管理缓冲区。实际上,在头文件stdio.h中,定义了一个名为FILE的类型,包含了所有与文件操作有关的数据成员,这个文件类型是文件处理的基础。文件类型FILE不是C语言的新类型,它是用typedef定义出来的有关文

13、件信息的一种结构体类型。如Turbo C的stdio.h文件中有如下的定义:,typedef struct short level; /* 缓冲区“满”或“空”的程度 */ unsigned flags; /* 文件状态标志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 如无缓冲区不读取字符 */ short bsize; /* 缓冲区的大小 */ unsigned char *buffer;/* 数据缓冲区的位置 */ unsigned char *curp; /* 当前工作指针 */ unsigned istemp; /* 临时文件,指示器

14、*/ short token; /* 用于有效性检查 */ FILE;,有了FILE类型之后,可以定义文件型指针。如“FILE *fp;”, fp是一个文件型的指针,将指向某个文件,即指向FILE型的结构体型变量中有关文件的信息,通过这些信息能够找到与它相关的文件。如果有n个文件,一般应设n个文件指针,使它们分别指向n个文件,以实现对文件的访问。 实际上,文件指针就可以理解为数据流。设了一个文件型指针,然后将打开文件时返回的具体文件的首地址赋给该指针,就建立起了程序与文件间的数据流,后续的程序对该文件的一切操作只需针对此指针操作,即脱离具体的文件,只面向数据流操作。在完成具体的文件操作之后,关

15、闭文件时,就切断了该文件型指针与文件间的联系,此指针不再指向那个文件,也就是切断了该文件的数据流。,10.2 文件的打开与关闭 C语言中,没有输入/输出语句,对文件的操作都是用库函数来实现的。下面将介绍缓冲文件系统的打开和关闭函数。 10.2.1 文件的打开(fopen()函数) 打开函数fopen() 的调用方式是: FILE *fp; fp=fopen(文件名,使用文件方式); 例如, fp=fopen(“A1.DAT“,“r“);,它表示,要打开名字为A1.DAT的文件,使用文件方式为“读入”,fopen()函数带回指向A1.DAT文件的指针并赋给fp,这样fp就和A1.DAT相联系了,

16、或者说,fp指向A1.DAT 文件。可以看出,在打开一个文件时,将给编译系统通知以下三个信息: (1) 需要打开的文件名。也就是准备访问的文件的名字。 (2) 使用文件的方式(读还是写等)。 (3) 让哪一个指针变量指向被打开的文件。 文件使用方式见表10.1。,说明: (1) 表中所用字母分别为单词read,write,append,binary 或其组合词的首字母。 (2) 用“r“方式打开的文件只能用于从该文件中读出数据至计算机的内存变量中,而不能用作向该文件写数据。而且该文件应该已经存在,不能用“r“方式打开一个并不存在的文件。 (3) 用“w“方式打开的文件只能用于向该文件写数据,而不能用来从文件中读出数据。 如果原来不存在该文件,则在打开时新建立一个按指定名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。,(4) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a“方式打开,但此时该文件必须存在,否则将得到出错信息。打开时,位

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

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

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