juliusun.com
第 50/50 节 冥河C语言教程
文件一般指存储在外部介质上数据的集合。为了简化用户对输入输出设备的操作,操作系统通常将各种设备都统一作为文件来处理,如显示屏、打印机、U盾等。本节所讲的文件,一般指存储在磁盘上的文件,磁盘如硬盘、U盘、光盘等。
不同的操作系统,表示文件的路径方法有所不同。本节以Windows操作系统的文件路径表示方法为例。
C语言将文件分为 ASCII文件 和 二进制文件 两种类型,ASCII文件又被称为文本文件。文件均是多个字节内容的集合。
文本文件的每个字节都是ASCII码。
二进制文件每个字节内容,只要是一个合法的二进制字节内容即可。
文本文件由ASCII码组成,二进制文件,可以由ASCII码或非ASCII码组成,所以文本文件也可以当作二进制文件来处理。而二进制文件当作文本文件来处理,可能会出错。
严格来说,仅存在二进制文件就足够了。考虑到文本文件常用性,C语言将文本文件单分出一种类型。C语言虽然这样区分,但是读者应该明白,文本文件仅是二进制文件的一种。是由于常用性人为的区分出来的。
文件虽然是有多个字节组成,但不必把每个字节单独使用,如可以把4个字节当作一个long类型来使用,其实把多个字节当作一个结构体来使用。好比内存是由多个字节组成,但是变量并不一定都是单字节大小。
每个正在使用的文件,系统都会给分配一个结构体来记录信息,此结构体为FILE。当打开或创建一个文件,系统则会返回此文件对应的结构体指针,即FILE *类型。以后在操作对应的文件时,只要拿这个文件指针当作参数就行了。
注意:FILE不是一种新的C语言预定义类型,是系统用typedef关键字为一个与文件相关的结构体定义的别名。
文件操作,没有特别的语法,就是调用相当的文件操作函数就行了。
本节重点介绍以下函数:
文件打开或创建:fopen
向文件写入数据:fwrite
从文件中读取数据:fread
关闭文件:fclose
这些函数均以f开头。注意,关闭文件函数fclose作用是关闭文件的使用,清理对应的FILE结构体信息,释放资源,不会删除文件本身。
文件不再使用最好正确关闭文件,否则可能会拖累系统运行速度并且占用不必要的内存空间及其它资源。
fopen功能是打开或创建文件并返回文件指针,原型为:
FILE * fopen ( char * filename , char * mode );
参数filename是文件名,mode是文件使用模式。
fopen返回值为FILE *类型,是文件信息的指针。如果返回值为NULL,表示打开或创建文件失败。
mode取值与意义关系如下:
文件使用模式表
值 | 含义 | 文件不存在时 |
---|---|---|
"r" | 文本文件,只读,文件已存在的文件,只能读取文件内容 | 出错 |
"w" | 文本文件,只写,打开或新建文件,只能写入数据 | 新建文件 |
"a" | 文本文件,追加,向文件尾添加数据 | 出错 |
"r+" | 文本文件,读写,读取或写入数据 | 出错 |
"w+" | 文本文件,读写,创建一个新文件 | 新建文件 |
"a+" | 文本文件,追加,读取或写入数据 | 新建文件 |
"rb" | 二进制文件,只读,文件已存在的文件,只能读取文件内容 | 出错 |
"wb" | 二进制,只写,打开或新建文件,只能写入数据 | 新建文件 |
"ab" | 二进制文件,追加,向文件尾添加数据 | 出错 |
"rb+" | 二进制文件,读写,读取或写入数据 | 出错 |
"wb+" | 二进制文件,读写,创建一个新文件 | 新建文件 |
"ab+" | 二进制文件,追加,读取或写入数据 | 新建文件 |
fread把文件内容读取到内存中,原型为:
unsigned int fread(void *pbuff,unsigned int size,unsigned int count,struct FILE * file);
pbuff是一个指针,表示读取的内容将存储到这个地址指向的内存中。size表示单个元素的大小,单位为字节。count表示读取多少元素。如果文件足够大,共会读取size乘以count个字节。file指明要从哪个文件中读取。
函数返回读取了多少个元素。一般和count相等。当参数count多于文件实际元素个数时,返回值可能小于count。
fwrite把内存中的数据写入到文件,原型为:
unsigned int fwrite(void *pbuff,unsigned int size,unsigned int count,struct FILE * file);
pbuff是一个指针,将这个地址指向的内存块数据写入到文件中。size表示单个元素的大小,单位为字节。count表示写入多少元素。如果不发生意外,共会写入size乘以count个字节。file指明写入哪个文件中。
函数返回写入了多少个元素。一般和count相等。当磁盘空间不足等原因,返回值可能小于count。
通常fread和fwrite函数,我们只在乎size和count的乘积,而不是严格按规定传递参数。通常将size设置成1,然后将count参数设置成写入或读取的总大小,或是相反。
fclose关闭文件,原型为:
int fclose(struct FILE * file);
file参数表示要关闭的文件指针。
fclose关闭文件成功返回0,否则返回EOF,EOF即为-1,是头文件定义的宏。
注意,根据平台不同fwrite并不一定是立即生效的。比如windows系统,fwrite执行后,仅仅将写入的数据放在缓存中,系统根据电脑运行状况,在文件关闭前,选择时机将数据写入到文件。如果读取文件后,马上读取文件,先用fclose关闭一下文件再打开。
文件操作函数其它还有fputs、fgets、fputc、fgetc等,有兴趣可以自己查查使用手册。
下面举个例子,如果文件操作函数使用上有不懂的地方,再向上翻动页面,查看函数说明。下例向文件写入一个字符串关闭文件,并再次读取再关闭文件。
效果类似如下图:
在D盘会发现123.txt文件:
Windows自带的记事本可以打开并查看文件内容: