目录
文件的概念
文件的分类
文件是一组相关数据的集合。在C程序设计中,按文件的内容可以分为两类:
一类是程序文件,它是程序的源代码,比如图中test..c就是程序文件,当然windows下通过编译器产生的目标文件(.obj)、程序文件(.exe)都是程序文件
另一类是数据文件,它是程序运行时需要的原始数据及输出的结果,比如如图中的data.txt
这两类文件都保存在磁盘上,随时可以使用。
程序文件的操作自然不需要讲解了,这里讲的是关于数据文件的操作,即如何在程序文件中通过相关的函数管理数据文件
数据文件的分类
按数据的存储形式,数据文件可以分为文本文件和二进制文件两类。
文本文件
上图中的data.txt就是文本文件
文本文件,也称为ASCII文件,是一种字符流文件。文件由一个个字符首尾相接而成,其中每个字符占1字节,存放的是字符的·ASCII码 。
例如,一个int型的整数-25612,它在内存中是以二进制形式存放的,占4个字节,而在文本文件中,它是按书写形式-25612存放的,每个字符占一个字节,总共要占6个字节。
在程序文件中若要将该数写入文本文件中,首先要将内存中4字节的二进制数转换成6个字符的ASCII码;若要将该数从文本文件读进内存即程序文件要从文本文件中读取该数据,首先要将这6个字符转换成4字节的二进制数,当然转换的过程操作系统会帮我们完成。
二进制文件
二进制文件中的数据 是按其在内存中的存储形式存放的。
例如,一个double型的常数1.0,不管其书写形式如何,在内存中及二进制文件中均占8字节。
由于二进制文件在输入\输出时,不必进行转换,故效率高,但二进制文件只能供机器阅读,无法人工阅读;而且由于不同的计算机系统对数据的二进制表示也各有差异,因此可移植性差。一般用二进制文件来保存数据处理的中间结果。
通过上图的程序文件生成二进制文件test.txt并向其写入数据"张三", 20, 99.2f
可见二进制文件无法直接供人工阅读
文件的操作
文件的打开与关闭
文件在读写之前需要我们自己先打开文件,在使用结束之后需要我们自己关闭文件。
打开文件
用标准库函数fopen,它通知编译器系统三个信息:需要打开的文件名;使用文件的方式(只读、只写还是既可以读又可以写);返回一个文件指针给编译器。
函数原型:FILE *fopen(const char *path, const char *mode);
返回值:打开文件失败返回NULL,成功返回一个文件指针
关闭文件
用标准库函数fclose,它的功能是把数据真正写入磁盘(数据可能还在缓冲区中),切断文件指针与文件之间的联系,释放结构体变量。如果不关闭多半会丢失数据而且同时打开的文件数目是有限制的。(当程序正常运行结束时,系统也会自动关闭所有已打开的文件)
函数原型:int fclose(FILE *fp);
注意fclose函数不会使fp指针置为NULL,因此为了防止被误用我们需要手动的将fp=NULL;
相信刚才小伙伴会有三个疑问:文件指针是啥?为什么fopen的第一个参数是path(路径),不应该是文件名吗?缓冲区是啥?请客官们细细往下看。
文件指针
操作系统声明了一个结构体
例如, VS2008编译环境提供的 stdio.h 头文件中有以下的文件类型声明:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
当我们使用fopen函数打开一个文件时,操作系统帮我们创建了FILE类型的结构体变量,如何通过fopen将该结构体变量的地址进行返回,因此我们需要定义一个FILE类型的指针接收该结构体变量的地址。
该结构体变量用来存放文件的相关信息(如文件的名字,文件状态及 文件当前的位置等)
FILE类型的指针便是文件指针 ,通过该文件指针来管理该文件
文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件标识包含3部分:文件路径 + 文件名主干 + 文件后缀
为了方便起见,文件标识常被称为文件名。
现在明白fopen的第一个参数为啥是path了吧
文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,
所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的输出缓冲区,装满输出缓冲区后才一起送到磁盘 上(如果提取关闭文件或者程序结束即使该缓冲区未满也可将数据送到磁盘上)。
从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存的输入缓冲区,通过函数再从输入缓冲区逐 个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的
fopen函数的第二个参数
其第二个参数为文件的使用方式,有如下几种
文件使用方式 |
含义 |
指定文件的状态 |
“r”(只读) |
为了输入数据,打开一个已经存在的文本文件 |
文件不存在或不允许读出错(即返回NULL) |
“w”(只写) |
为了输出数据,打开一个文本文件(原内容清空) |
文件不存在则建立一个新的文件,若存在,则原内容清空,从起始位置写 |
“a”(追加) |
向文本文件尾添加数据 |
文件不存在建立一个新的文件,若存在则在原有内容之后写入数据 |