第十二章文件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、fputc和fgetc函数使用举例 [例12.1]从键盘输入一些字符,逐个把它们送到磁盘上去, 直到输入一个”#”,为止 #include<stdio.h>
注意:ANSl c提供一个feof函数来判断 文件是否真的结束。feof(fp)用来测试fp所 指向的文件当前状态是否”文件结束”。如果是文件结 束,函数feof (fp)的值为l(真),否则为 0(假)。 如果想顺序读入一个二进制文件中的数据,可以用: while(!feof(fp)) {c=fgetc(fp); } 当未遇文件结束,feof(fp)的值为0,!fe of(fp)为1,读入一个字节的数据赋给整型变量 c(当然可以接着对这些数据进行所需的处理)。直到遇 文件结束,feof(fp)值为1,!feof(f p)值为0,不再执行while循环。 这种方法也适用于文本文件。
12.3.2 文件的关闭(fclose函数) 在使用完一个文件后应该关闭它,以防止它再被误 用。“关闭”,就是使文件指针变量不指向该文件,也 就是文件指针变量与文件”脱钩”,此后不能再通过该 指针对其相连的文件进行读写操作,除非再次打开,使 该指针变量重新指向该文件。 用fclose函数关闭文件。fclose函数 调用的一般形式为 fclose (文件指针); 例如 fclose (fp); 用fopen函数打开文件时所带回的指针赋给了 fp,把该文件关闭。 应该养成在程序终止之前关闭所有使用的文件的习 惯,如果不关闭文件将会丢失数据.
7.在用文本文件向计算机输入时,将回车换行符转 换为一个换行符,在输出时把换行符转换成为回车和 换行两个字符。在用二进制文件时,不进行这种转换, 在内存中的数据形式与输出到外部文件中的数据形式 完全一致,一一对应。
8.在程序开始运行时,系统自动打开三个标准文 件:标准输入、标准输出、标准出错输出。通常这三 个文件都与终端相联系。因此以前我们所用到的从终 端输入或输出,都不需要打开终端文件。 系统自动定义了三个文件指针stdin、std out和stderr,分别指向终端输入、输出、 出错输出。如果程序中指定要从stdin所指的文 件输入数据,就是指从终端键盘输入数据。
我们在第三章介绍过putchar函数,其实pu tchar是从fputc函数派生出来的。putc har(c)是用#define定义的宏: #define putchar ( c ) fputc (c,stdout) 前面已叙述,stdout是系统定义的文件指 针变量,它与终端输出相连。fputc(c,st dout)的作用是将c的值输出到终端。用宏put char(c)比写fputc(c,stdout) 简单一些,从用户的角度,可以把putchar (c)看作函数而不必严格地称它为宏. 二、fgetc函数 从指定文件读入一个字符,该文件必须是以读或 读写方式打开的。
$12.3文件的打开与关闭 对文件读写之前应该“打开”该文件,在使用结 束之后应关闭该文件。 12.3.1 文件的打开(fopen函数) ANSI C规定了标准输入输出函数库,用 fopen( )函数来实现打开文件。fopen函数的 调用方式通常为: FILE *fp; fp=fopen(文件名,使用文件方式); 例如 fp=fopen(”A1”,”r”) 要打开名字为A1的文件,使用文件方式为“读 入”,fopen函数带回指向A1文件的指针并赋给fp, 这样fp就和A1相联系了,或者说,fp指向A1文件.
第十二章 文 件 $12.1 C文件概述 在程序运行时,程序本身和数据一般都存放在内存 中。当程序运行结束后,存放在内存中的数据被释 放。如果需要长期保存程序运行所需的原始数据, 或程序运行产生的结果,就必须以文件形式存储到 外部存储介质上。 文件(file)是程序设计中一个重要的概念。所谓 “文件”一般指:存储在外部介质上数据的集合, 一批数据是以文件的形式存放在外部介质(如磁盘) 上的。
2.用”w”方式打开的文件只能用于 向该文件写数据,而不能用来向计算机输入。 如果原来不存在该文件,则在打开时新建立一 个以指定名字命名的文件。如果原来已存在一 个以该文件名命名的文件,则在打开时将该文 件删去,然后重新建立一个新文件。 3.如果希望向文件末尾添加新的数据 (不希望删除原有数据),则应该用“a”方 式打开。但此时该文件必须已存在,否则将得 到出错信息。打开时,位置指针移到文件末尾。
1.文件与文件名 文件是指存放在外部存储介质上的数据集合。
为标识一个文件,每个文件都必须有一个文件名,其一 般结构为:主文件名[.扩展名] 2.文件分类 可以从不同的角度对文件进行分类: (1)根据文件的内容,可分为程序文件和数据文件, 程序文件又可分为源文件、目标文件和可执行文件。
(2)根据文件的存储形式,可分为ASCII码文件和二 进制文件。 ASCII码文件的每1个字节存储1个字符,因而便于对 字符进行逐个处理。但一般占用存储空间较多,而且 要花费转换时间(二进制与ASCII码之间的转换)。 二进制文件是把内存中的数据,原样输出到磁盘文件 中。可以节省存储空间和转换时间,但1个字节并不 对应1个字符,不能直接输出字符形式。
4.用”r十”、”w十”、”a十”方式打开的 文件可以用来输入和输出数据。用”r十”方式时该 文件应该已经存在,以便能向计算机输入数据。用 “w十”,方式则新建立一个文件,先向此文件写数 据,然后可以读此文件中的数据。用”a+”方式打 开的文件,原来的文件不被删去. 5.如果不能实现”打开”的任务,fopen函数 将会带回一个出错信息。出错的原因可能是:用”r” 方式打开一个并不存在的文件;磁盘出故障; 磁盘已满无法建立新文件等。此时fopen函数 将带回一个空指针值NULL 。
缓冲区 数据区 缓冲区 磁盘
所谓缓冲文件系统是指:系统自动地在内存区为 每一个正在使用的文件名开辟一个缓冲区。从内存向 磁盘输出数据必须先送到内存中的缓冲区,装满缓冲 区后才一起送到磁盘去。如果从磁盘向内存读入数据, 则一次从磁盘文件将一批数据输入到内存缓冲区(充 满缓冲区),然后再从缓冲区逐个地将数据送到程序 数据区(给程序变量)。缓冲区的大小由各个具体的 C版本确定,一般为512字节。 所谓“非缓冲文件系统”是指系统不自动开辟确 定大小的缓冲区,而由程序为每个文件设定缓冲区。 在C语言中,没有输入输出语句,对文件的读写 都是用库函数来实现的。
因为,如前所述,在向文件写数据时,是先将数据 输到缓冲区,待缓冲区充满后才正式输出给文件。 如果当数据未充满缓冲区而程序结束运行,就会将 缓冲区中的数据丢失。用fclose函数关闭文 件,可以避免这个问题,它先把缓冲区中的数据输 出到磁盘文件然后才释放文件指针变量 fclose函数也带回一个值:当顺利地执 行了关闭操作,则返回值为0;如果返回值为非零 值,则表示关闭时有错误。可以用ferror函 数来测试(见12.6.1)。
有了FILE类型之后,可以用它来定义若干个FILE类型 的变量,以便存放若干个文件的信息。例如,可以定 义以下FILE类型的数组。 FILE efile[maxfile] 定义了一个结构体数组efile[],它有maxfile个元素, maxfile是一个符号常量,它的值是可使用的文件的 最大数目。 可以定义文件型指针变量。如 FILE *fp; fp是一个指向FILE类型结构体的指针变量。可以 使fp指向某一个文件的结构体变量,从而通过该结构 体变量中的文件信息能够访问该文件。也就是说,通 过文件指针变量能够找到与它相关的文件。 如果有n个文件,一般应设n个指针变量(指向FI LE类型结构体的指针变量),使它们分别指向n个 文件(确切他说,指向该文件的信息结构体),以实 现对文件的访问。
常用下面的方法打开一个文件: if((fp = fopen(“filel”,” r”))==NULL) {printf(”cannot oPen this file\n"); exit(0); } 即先检查打开是否出错,如果有错就在终端上输出” cannot open this file“。 exit函数的作用是关闭所有文件,终止正调用的 过程。待程序员检查出错误,修改后再运行。
在C语言中对文件的存取是以字符(字节)为单位的。 输入输出的数据流的开始和结束仅受程序控制而不 受物理符号(如回车换行符)控制。我们把这种文 件称为流式文件。C语言允许对文件存取一个字符, 就增加了处理的灵活性。 在过去使用的C版本(如UNIX系统下使用的 C)有两种对文件的处理方法:一种叫“缓冲文件 系统”,一种叫“非缓冲文件系统”。
fgetc函数的调用形式为 ch=fgetc(fp); fp为文件型指针变量,ch为字符变量。fgetc 函数带回一个字符,赋给ch。如果在执行fgetc 读字符时遇到文件结束符,函数返回一个文件结束标 志EOF,EoF在stdio.h中定义为一1。 如果想从一个磁盘文件顺序读入字符并在屏幕上显示 出来,可以: ch=fgetc(fp); while(ch!=EOF) {putchar(ch); ch=fgetc(fp); }
Fra Baidu bibliotek
在打开一个文件时,通知给编译系统以下三个信息: 1)需要打开的文件名,也就是准备访问的文件的名。 2)使用文件的方式(读还是写等)。 3)让哪一个指针变量指向被打开的文件。 使用文件方式见表12.1。 使用文件的方式 r rb r+ rb+ w wb w+ wb+ a ab a+ ab+ 说明: 1.用”r”方式打开的文件只能用于向计算机 输入而不能用作向该文件输出数据,而且该文件应该 已经存在,不能打开一个并不存在的用于”r”,方 式的文件(即输入文件),否则出错。
$12.4文件的读写 文件打开之后,就可以对它进行读写了。常用的 读写函数如下。 12.4.1 fputc函数和fgetc函数 (putc函数和getc函数) 一、fputc函数把一个字符写到磁盘文件上去。 其一般形式为 fputc (ch,fp); 其中ch是要输出的字符,它可以是一个字符常 量,也可以是一个字符变量。fp是文件指针变量, 它从fopen函数得到返回值。上面fputc(c h,fp)函数的作用是将字符(ch的值)输出到f p所指向的文件上去。fputc函数也带回一个值: 如果输出成功则返回值就是输出的字符;如果输出失 败,则返回一个EOF。 EOF是在stdio. h文件中定义的符号常量,值为一1。
如果有一个整数10000,在内存中占2个字节, 如果按ASCII形式输出,则占5个字节,而按二进制 形式输出,在磁盘上只占2个字节。用ASCII码形式 输出与字符一一对应。 (00100111 00010000 )2 =213+210+29+28+24 00110001 00110000 00110000 00110000 00110000 00100111 00010000
6.用以上方式可以打开文本文件或二进制文件,这 是ANSI C的规定,用同一种缓冲文件系统来处理 文本文件和二进制文件。但目前使用的有些C编译系 统可能不完全提供所有这些功能(例如有的只能 用”r”."w”."a"方式),有的c版本不用”r 十”,、”w十”、”a+”而用”rW”、”w r”、”ar”等,请读者注意所用系统的规定。
$12.2文件类型指针 缓冲文件系统中,关键的概念是“文件指针”。 每个被使用的文件都在内存中开辟一个区,用来存放 文件的有关信息(如文件的名字、文件状态及文件当 前位置等)。这些信息是保存在一个结构体类型的变 量中的。该结构体类型是由系统定义的,取名为 FILE,有的C版本在stdio.h文件中有以下的 类型定义: typedef struct {int fd;/*文件号*/ int cleft;/*缓冲区中剩下的字符*/ int mode; /*文件操作模式*/ char nextc;/*下一个字符位置*/ char buff;/*文件缓冲区位置*/ } FILE ;