辽宁石油化工大学《C语言程序设计》第九章 文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第9章
文件
File
本章概要
Summary of the chapter
第9章主要介绍文件的概念及文件的操作。通过本章的学习,学生可以了解文件的概念、分类及基
本操作。要求学生熟练掌握文件的读写方法以及文件中几个常用函数。
前面各章中我们使用的输入输出函数都是对应于标准输入输出设备而言的。实际上,在程序运行时,常常需要将数据输出到磁盘上作长久的保存,以后需要时再从磁盘中读取数据。这就要用到磁盘文件。一般,磁盘文件可分为数据文件和程序文件两种,这里所介绍的文件操作主要是针对磁盘数据文件的使用和操作。
9.1 文件概述(The Summary of file)
9.1.1 文件的概念与文件结构(Conception and onstruction of file)
1.文件的概念(Conception)
文件是程序设计中一个重要的概念。所谓文件,是指存储在外部介质上数据的集合。数据是以文件的形式存放在外部介质上(如磁盘);计算机操作系统是以文件为单位对数据进行管理。
2.文件的结构(Construction of file)
C语言中文件是流式文件。它把数据看作是一连串的字符,不考虑回车换行符的控制,对文件的存取是以字符为单位的。
根据数据组织形式的不同,C语言的文件分为ASCII码文件(又称文本文件)和二进制文件两种。
ASCII码文件中的每个字节存放的是一个字符的ASCII代码。这样的文件便于对字符进行输入和输出的处理,但占用存储空间较大。例如,有一个整数65535,在内存中占2
第9章文件· 183 ·
个字节(11111111 11111111);如果按ASCII码形式输出则需要5个字节(00110110 00110101 00110101 00110011 00110101)。
二进制文件是把内存中的数据按照其在内存中的存储形式原样输出到磁盘上存放。这种形式的文件节省外存空间,但不能直接输出字符形式。例如,前面提到的整数65535,如果按二进制形式输出只占2个字节(11111111 11111111)。
9.1.2 文件系统的缓冲性(Buffer characteristic of file system)
在ANSI C标准出现之前,C语言对文件的处理方法有两种:一种为缓冲文件系统;另一种为非缓冲文件系统。缓冲文件系统用来处理ASCII码文件,非缓冲文件系统用来处理二进制文件。1983年美国国家标准化协会制定的ANSI C标准规定不再采用非缓冲文件系统,只采用缓冲文件系统。并将其扩充为可以处理二进制文件。
1.缓冲文件系统(Buffer file system)
缓冲文件系统是指系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。
当需要将数据从内存输出到磁盘时,必须先将其送到内存缓冲区中,缓冲区装满后再向磁盘输出。如果需要将数据从磁盘读入内存,则先将磁盘文件中的一批数据送到缓冲区,然后再从缓冲区将数据输入程序数据区。
使用缓冲文件系统减少了读写磁盘的次数,提高工作效率。
2.非缓冲文件系统(non-buffer file system)
非缓冲文件系统是指系统不自动开辟确定大小的缓冲区,而是由程序根据需要为每个文件设定缓冲区。
9.2 文件的输入/输出(Input/Output of file)
在C语言中,使用文件要遵循一定的规则:先打开文件,然后处理文件,处理结束后将其关闭。这些打开、处理以及关闭文件的操作是通过标准输入输出函数实现的。
9.2.1 文件类型指针(File type pointer)
前面已经提到,在读写文件前,需要使用“打开文件函数”将文件打开。打开文件函数的工作就是接受文件的外部名,返回文件的内部名。此处的内部名是指向含有文件信息结构的指针,称为文件类型指针。
在C语言中,每个被使用的文件都在内存中开辟一个区域,用来存储文件名、文件状态以及文件当前位置等有关信息。这些信息被保存在一个名字为FILE的结构体类型的变
量中。此结构体变量是由系统在stdio.h中定义的。FILE定义形式如下:
typedef struct
{
· 184 ·第9章文件
int _fd; /*文件号*/
int _cleft; /*缓冲区中剩余字符*/
int _mode; /*文件操作模式*/
char *_nextc; /*下一个字符位置*/
char *_buff; /*文件缓冲区位置*/
}FILE;
有了FILE类型之后,就可以利用它定义FILE类型的变量,以便存放文件信息。我们可以用下面的方式说明一个文件类型指针变量:
FILE *fp;
fp是一个指向FILE类型结构体的指针变量。我们可以进一步使fp成为一个指向某一文件的结构体变量,并通过该变量中的信息访问该文件。
我们可以使用FILE类型同时定义多个文件类型指针变量,使它们指向多个文件,实现对多个文件的访问。例如:
FILE *fp1,*fp2;
定义了2个FILE类型的指针变量fp1、fp2。
9.2.2 文件的打开与关闭(Open and colse of file)
1.文件的打开(open of file)
打开文件使用的是标准输入输出函数库中的fopen( )函数,其格式为
FILE *fp;
fp=fopen(文件名,文件操作方式);
其中,fp是FILE类型指针,指向被打开的文件;文件名是指文件的外部名,可含驱动器及路径。例如:“D:\aa\aa.txt”;文件操作方式指出文件的存取方式,文件操作方式见表9.1。整个命令的功能是:以指定的方式打开文件,若函数调用成功则返回一个指向该文件的FILE类型的指针,否则返回NULL。
在例9.1中的指令:
fp1=fopen("in.dat","r"); /*打开文件in.dat准备读*/
fp2=fopen("out.dat","w"); /*打开文件out.dat准备写*/
if (fp1= =NULL || fp2= =NULL)/*如果文件不能打开退出程序*/
exit(0);
分别表示:文件in.dat以“读”方式被打开;文件out.dat以“写”方式被打开;返回的FILE类型指针被赋给fp1和fp2,如果文件打开失败则退出程序。
表9.1 文件操作方式
文件操作方式含义
"r"(只读)为输入打开一个文本文件
"w"(只写)为输出或建立打开一个文本文件
"a"(追加)向文本文件末尾追加数据
"rb"(只读)为输入打开一个二进制文件