在程序编写过程中,如果只是将数据存放在内存中,那么当程序结束时,内存被释放,数据也就没了。如果想要长久地保存数据,就要将数据写为文件,保存到磁盘里。ANSIC规定使用fopen函数来打开文件,fclose函数来关闭文件。
fopen函数的使用
fopen函数需要我们传两个字符串类型的参数。
第一个字符串传文件的地址、文件名和文件后缀,地址也可不写,如果不写地址,程序就会在当前目录下寻找文件。
第二个字符串传文件的使用方式,如下图所示:
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输入数据,打开一个文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建立一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写,打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,建立一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读写 | 建立一个新的文件 |
当fopen函数接受到我们的传参后会返回一个FILE*类型的指针变量,即文件指针变量。我们需要创建一个FILE*类型变量来接收。通过这个FILE*类型的变量,我们可以实现对文件的操作。
当然文件并不是一定能打开成功,所以我们需要进行一个判断,当文件打开失败时,函数返回空指针。
举例:
FILE* pf = fopen("text,txt", "r");
if(NULL == pf){
perror("");//报错
return;
}
文件的打开细节与文件指针变量
当文件被打开时,系统会在内存中开辟一块文件信息区,用来存放文件的相关信息(如文件名、文件内容等等)。这些信息被保存在一个结构体变量中,系统将其取名为FILE。
如下是VS2013编译器对该结构体变量的声明:
struct _iobuf{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
};
typedef struct _iobuf FILE;
不同编译器下的声明内容不完全相同,但大同小异。使用者不必在意细节,会用就行。
fclose函数的使用
fclose函数使用起来非常简单,只需要将指向你想关闭文件的FILE*变量传参即可关闭文件。
ps:为什么一定要关闭文件?
文件不及时关闭会占用大量内存。