C语言(第12章)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

文本
用‚ a”方式则可以向一个原已 后面 6种方式是在前 二进制 说明 6种方式基础 用‚r”时只能对该文件读,而用
w+ a+
wb+ ab+
为读/写新建(已存在时出错) 为读/写打开/新建(指向末尾)
文件的打开(fopen函数)


调用fopen函数后,fopen函数有一个返回值。 如果打开文件操作成功,它是一个地址值,指向被打 文件名 开文件的文件信息区(结构体变量)的起始地址。 使用方法 操作 简而言之,在打开一个文件时,程序要通 C程序 系统 如果在执行打开操作时失败 ( 例如用‚r”方式打开一个 知fopen函数三个方面的信息: 不存在的文件 ),则函数返回值是一个NULL指针(即地 ①要打开哪一个文件,以‚文件名‛指出; 址值为0 ,它是一个无效的指向 )。 指向文件的指针 ②对文件的使用方式 (字符串 ); fopen函数的返回值应当立即赋给一个文件类型指针变量 ③函数的返回值赋给哪一个指针变量,或 者说,让哪一个指针变量指向该文件。 (例如前面定义的 fpl,fp2,或fp3等),以便以后能通过该 指针变量来访问此文件,否则此函数返回值就会丢失而导 致程序中无法对此文件进行操作。
教学内容

文件系统概述 文件的打开与关闭


文件的顺序读写
文件的定位与随机读写
文件操作的出错检测
非缓冲文件系统(系统级I/O)
§12.1 文件系统概述

文件的概念
‚文件‛是指记录在外部介质上的数据的集合。例如
用编辑程序编好的一个. c源程序是一个文件,编译后 生成的.obj,连接后生成的.exe等也是文件,把它们存放 到磁盘上就是一个磁盘文件。
文件(FILE)类型指针

定义文件类型指针变量的一般形式为:
FILE *文件结构体指针变量名;
例如: FILE *fpl,*fp2,*fp3;

上例定义了三个指针变量fpl,fp2,fp3,它们都是指 向FILE类型结构体数据的指针变量,但此时它们还未 具体指向哪一个结构体变量;FILE类型的结构体变量 在执行打开文件的函数时才生成,并由该函数返回其 起始地址,并在执行关闭文件的函数后释放。
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)


标准I/O提供4种读写文件的方法,C语言中相对应的函 数是: 读写一个字符: 用fgetc和fputc函数; 读写一个字符串: 用fgets和fputs函数; 格式化读写: 用fscanf和fprintf函数; 按‚记录‛读写: 用fread和fwfite函数。 系统I/O(非缓冲系统)不提供前面3种功能的函数,只提 供第4种函数: 按‚记录‛读写:用read和write函数。
文件(FILE)类型指针


FILE类型的结构体变量不用变量名来标识,而要设置 一个指向该结构体变量的指针变量(文件指针),通过它 来访问该结构体变量。 文件指针是缓冲文件系统的一个很重要的概念,只有 通过文件指针才能调用相应的文件。
fp1-> 文件1 的 信息区(结 构体变量) fp2-> 文件2 的 信息区(结 构体变量) fp3-> 文件3 的 信息区(结 构体变量)
ຫໍສະໝຸດ Baidu
文件的关闭(fclose函数)



文件关闭后,保存该文件信息的结构体变量被清 除,原来的指针变量不再指向该文件,此后也就 不可以通过此指针来访问该文件。 如果是执行写操作后用fclose关闭文件,则系统会 先将输出文件缓冲区的内容(不论缓冲区是否已满) 都输出给文件,然后再关闭文件。这样可以防止 丢失本来应写到文件上的数据。 如果不关闭文件而直接使程序停止运行,这时就 会丢失缓冲区中还未写人文件的信息。因此必须 注意:文件用完后必须关闭。
广义地说,所有输入输出设备都是文件,例如打印机
文件、卡片文件、磁带文件等。计算机以这些设备为 对象进行输人输出时,对这些设备的处理方法统一按 ‚文件‛处理。
§12.1 文件系统概述

文件可以从不同的角度进行分类: 按文件所依附的介质来分:有卡片文件、纸带 文件、磁带文件、磁盘文件等。 按文件的内容区分:有源程序、目标文件、可 执行程序文件、数据文件等。 按文件中数据的组织形式区分:数据文件可分 为字符代码文件(也称字符文件或文本文件或 正文文件)和二进制文件。
§12.2 文件的打开与关闭
对磁盘文件的操作必须: “先打开 后读写 最后关闭‛

文件的打开 (fopen函数) 文件的关闭 (fclose函数)
文件的打开(fopen函数)


所谓‚打开‛,是在程序和操作系统之间建立起 联系,程序把所要操作的文件的一些信息通知给 操作系统。这些信息中除包括文件名,即打开哪 个文件外,还要指出操作方式(读还是写)。 fopen函数的原型是:
文件的打开(fopen函数)

常用下面的方法打开一个文件: if ( (fp= fopen("file1","r") ) = = NULL) { printf("无法打开该文件\n"); exit (0); } exit是一个函数,其作用是关闭 在main函数中也可用以下方式: 所有文件,使程序结束,并返回 操作系统,同时把括弧中的值传 一般情况下, exit(0)表示正常退 if ( (fp= fopen("file1","r") ) = = NULL) 送给操作系统。 出。如果括弧内为非零值,则表 示程序是出错后退出的。也可以 { printf("无法打开该文件 \n"); 使括弧内空缺,即exit( )。 return; }
FILE *fopen(char *filename, char *mode);
文件使用方式 函数返回值为文件指针, 文件名 指向FILE结构体类型变 量的起始地址
文件的打开(fopen函数)
文件打开方式 方式\格式 只读 只写 追加 读/写 读/写 追加
上加一个‚+”符号。其区别是由 存在的文件末尾补加新的数据。 ‚ r+”时则可对该文件执行读操作, 用‚ a+”方式则可以在追补数 单一的读或写的方式扩展为又能 r rb在读完数据后,可以向该文件写 以上是 ANSI C 的规定。它能够处理字 为输入打开 据后再读人这些数据。 读又能写的方式。 符文件和二进制文件。但有些 C。 语言的 “ w+”则是建立一个新文件, 入数据 ( 更新文件 ) w wb 为输出新建 缓冲文件系统不具备以上全部功能, 可以对它写人数据,然后又 因此在用到有关这些方式时请注意查 可以读人这些数据。 a ab 向文件尾增补 阅所用C语言系统的说明书或上机试一 下即可。 r+ rb+ 为读/写打开(不存在时出错)

缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)

缓冲(高层)文件系统:为程序中每一个打开的文件
在内存中开辟一个‚缓冲区‛。 从磁盘文件读入数据时,数据先送到‚输入缓冲区‛ 中,然后再从缓冲区依次将数据送给接收变量; 向磁盘文件输出数据时,先将程序中变量或表达式 的值送到‚输出缓冲区‛中,待装满缓冲区后才一 起写道磁盘文件。
标准输入、标准输出和标准出错输出
对磁盘文件,在使用前必须先打开,而对终端设备,尽 管它们也作为文件来处理,但并不需要使用‚打开文件‛ 的操作。为什么? 因为在程序运行时,系统自动地打开了三个标准文件: 不能用fclose函数关闭标准输入、输 标准输入,标准输出和标准出错输出,并定义了三个指 出和错误输出文件。 针变量:stdin, stdout 和 stderr,分别指向它们。这 三 个文件都是以终端设备作用输入输出对象的。 如果指定输出一个数据到stdout所指向的文件,就是指 输出到终端设备。为使用方便,允许在程序中不指定这 三个文件,也就是说,系统隐含的标准输入输出文件是 指终端。
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)
表12.1 标准I/O函数与终端I/O函数对照 标准I/O函数 fgetc fputc 终端I/O函数 getchar putchar 输入一个字符 输出一个字符 作用
fgets
fputs fscanf fprintf
gets
puts scanf printf
数据区
a
文件输入 缓冲区
磁盘文 件
数据区
a
文件输出 缓冲区
磁盘文 件
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)
设置输入输出缓冲区目的是:减少对磁盘的实际读
写次数,提高输入输出操作的效率。磁盘访问最小 只能以扇区为单位,且其读写速度远远低于读写内 存的速度。 缓冲文件系统自动为文件设置所需的缓冲区,缓冲 区的大小随机器和操作系统而异。
输入一个字符串
输出一个字符串 按指定格式输入若干变量的值 按指定格式输出若干数据
文件(FILE)类型指针


要调用一个文件,需要有以下的信息:文件当前的读写位 置;与该文件对应的内存缓冲区的地址;缓冲区中未被处 理的字符数;文件操作方式等。 缓冲文件系统为每一文件开辟一个‚文件信息区‛,用来 FILE的定义在stdio.h头文件 存放以上这些信息。这个‚文件信息区‛在内存中,是一 中,由系统事先指定的。它的 个结构体变量。这个结构体变量是由系统定义的,用户不 定义 (包括结构体中成员名、 请注意, FILE 不是结构体 必自己再去定义。其形式为: 成员个数、成员作用等 )在不 变量名,它是用 typedef typedef struct 同的C版本中不同。 定义的新类型名。 { ...... (结构体成员项,用来存放文件信息) } FILE;
字符文件与二进制文件

字符代码文件是指文件的内容是由一个一个字符组成的, 每一个字符用一个代码表示,一般用ASCII代码。例如一 个实数136.56,共有6个字符,如果按字符代码形式 (ASCII码)输出到磁盘上,一个字符占一个字节,故共占6 个字节。 二进制文件是指以数据在内存中存储形式原样输出到磁盘 上去,例如136.56在内存中以浮点形式存储,占4个字节, 而不是6个字节。若以二进制形式输出此数,就将该4个字 节按原来在内存的存储形式送到磁盘上去。不管一个实数 数值多大,都占4个字节。
文件的关闭(fclose函数)

关闭文件用fclose函数:
int fclose(FILE *文件指针变量);


功能: 通知系统,将此指针指向的文件关闭,释放 相应的文件信息区(结构体变量)。 返回值: 调用成功时返回0, 发生错误时返回EOF (EOF 是一个符号常量,在stdio.h中定义为-1)

非缓冲(低层)文件系统:
非缓冲系统直接依赖于操作系统,通过操作系统的
功能直接对文件进行操作。所以它称为‚系统输入 输出‛或‚低层输入输出‛系统。 非缓冲区文件系统不自动设置缓冲区,而要由用户 自己根据需要设置。
缓冲文件系统(标准I/O)和 非缓冲文件系统(系统I/O)


这两种文件系统分别使用不同的输入输出函数。其各 自的特点如下: 缓冲文件系统:由系统代替用户做了许多事情,功 能强、使用方便。 非缓冲文件系统:通过操作系统的功能直接对文件 进行操作,依赖于操作系统,编程序时需要人们熟 悉操作系统,编程难度大一些,但它的执行效率高, 节省内存。 为方便起见,一般把缓冲文件系统输入输出称为标准 输入输出(标准I/O),非缓冲文件系统的输入输出称为 系统级输入输出(系统I/O)。



§12.3 文件的顺序读写


输入和输出一个字符
(fgetc和fputc)
输入和输出一个字符串 (fgets和fputs)


格式化输入和输出
(fscanf和fprintf)
按‚纪录‛输入和输出 (fread和fwrite)
输入和输出一个字符

输出一个字符到磁盘文件
第十二章 文 件


到目前为止我们设计的程序只能从键盘输入 数据,将处理结果显示在屏幕上,程序结束 后这些数据都无法存留; 实际应用中,常需要输入大量的数据,处理 的结果也需要存留下来,以便查询; 文件是存储在外部介质上的数据集合,C语言 可以从文件中读取数据处理,也可以将内存 中的处理结果(数据)写到文件中。
相关文档
最新文档