返回首页   进站必读

16.2 fopen/fclose


16.2 fopen/fclose

在操作文件之前要用fopen打开文件, 操作完毕要用fclose关闭文件。 打开文件就是在操作系统中分配一些资源用于保存该文件的状态信息, 并得到该文件的标识,以后用户程序就可以用这个标识对文件做各种操作, 关闭文件则释放文件在操作系统中占用的资源,使文件的标识失效, 用户程序就无法再操作这个文件了。

#include <stdio.h>
FILE *fopen(const char *path, const char *mode);

返回值:成功返回文件指针,出错返回NULL并设置errno

mode参数是一个字符串,由rwatb+六个字符组合而成,r表示读,w表示写,a表示追加(Append),在文件末尾追加数据使文件的尺寸增大。t表示文本文件,b表示二进制文件,有些操作系统的文本文件和二进制文件格式不同,而在UNIX系统中,无论文本文件还是二进制文件都是由一串字节组成,t和b没有区分,用哪个都一样,也可以省略不写。如果省略t和b,rwa+四个字符有以下6种合法的组合:

”r”

只读,文件必须已存在

”w”

只写,如果文件不存在则创建,如果文件已存在则把文件长度截断(Truncate)为0字节再重新写,也就是替换掉原来的文件内容

”a”

只能在文件末尾追加数据,如果文件不存在则创建

“r+”

允许读和写,文件必须已存在

“w+”

允许读和写,如果文件不存在则创建,如果文件已存在则把文件长度截断为0字节再重新写

“a+”

允许读和追加数据,如果文件不存在则创建

在打开一个文件时如果出错,fopen将返回NULL并设置errno,errno稍后介绍。在程序中应该做出错处理,通常这样写:

if ( (fp = fopen("/tmp/file1", "r")) == NULL) {
	printf("error open file /tmp/file1!\n");
	exit(1);
}

比如/tmp/file1这个文件不存在,而r打开方式又不会创建这个文件,fopen就会出错返回。

再说说fclose函数。

#include <stdio.h>

int fclose(FILE *fp);

返回值:成功返回0,出错返回EOF并设置errno

把文件指针传给fclose可以关闭它所标识的文件,关闭之后该文件指针就无效了,不能再使用了。如果fclose调用出错(比如传给它一个无效的文件指针)则返回EOF并设置errno,errno稍后介绍,EOF在stdio.h中定义:

    /* End of file character.
       Some things throughout the library rely on this being -1.  */
#ifndef EOF
# define EOF (-1)
#endif

它的值是-1。fopen调用应该和fclose调用配对,打开文件操作完之后一定要记得关闭。 如果不调用fclose,在进程退出时系统会自动关闭文件,但是不能因此就忽略fclose调用, 如果写一个长年累月运行的程序(比如网络服务器程序),打开的文件都不关闭, 堆积得越来越多,就会占用越来越多的系统资源。 如下面的例子:

#include <stdio.h>

int main(void)
{
	FILE *fp;

	fp = fopen("1.txt","w+");
	if(fp == NULL) 
		return 0;
	fclose(fp);

	return 0;
}