目录
前 言
当我们想实现数据持久化,可以采用将数据存放在磁盘文件、或者数据库中等方式。
接下来将要介绍的内容即是如何通过C语言进行文件相关操作以实现数据持久化。
1 什么是文件
要操作文件,首先要了解什么是文件。磁盘上的文件就是文件。在程序设计中,从文件功能角度来看通常将文件分为两种:程序文件和数据文件。
程序文件
①源程序文件(后缀为.c)
②目标文件(windows环境后缀为.obj)
③可执行程序(windows环境后缀为.exe)
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
接下来我们所要讨论的操作对象即为数据文件。
在以往我们使用类似scanf、printf等函数所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,将运行结果显示到显示器上。但除此之外,我们还可以将信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这时所处理数据的输入输出则是以磁盘上文件为对象的。
既然要操作文件,那就要清楚我们要操作的是哪一个文件,而区分文件,依靠的则是文件的唯一标识。文件标识包含3个部分:文件路径+文件名主干+文件后缀。为了方便起见,文件标识也常被称为文件名,因此要注意之后所说的文件名不仅仅是我们常看到的文件的一个单独的名字。
2 文件的打开和关闭
以我们平常操作的word文件来说,文件的操作流程:在文件所属路径下打开文件->在文件中进行内容的增删改查->关闭文件。
2.1 文件指针
在缓冲文件系统中,一个关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字、文件的状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE。
例如,在VS2013编译环境提供的stdio.h头文件中就有以下的文件类型声明:
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};typedef struct _iobuf FILE;
不同的C编译器的FILE类型包含的内容不完全相同,但大同小异。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并根据文件填充其中对应的信息。如下,通常我们使用一个FILE类型的指针来维护FILE结构的变量以方便使用。
FILE* pf; //文件指针变量
这里定义的pf即是一个指向FILE类型数据的指针变量。如下图所示,当使pf指向某个文件的文件信息区(如上所说是一个结构体变量),通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
2.2 文件的打开和关闭
文件在读写之前应该先打开文件,使用结束后应该关闭文件。
ANSIC规定使用fopen函数来打开文件,fclose来关闭文件,如下为两个函数的声明:
//打开文件FILE * fopen ( const char * filename, const char * mode );其中:①filename为文件的名字;②mode表示打开文件的方式;③FILE*表示在调用函数打开文件的同时,会返回一个 FILE*的指针变量指向该文件,即相当于建立了指针和文件的关系,如果文件打开失败则会返回一个空指针。//关闭文件int fclose ( FILE * stream );其中:①stream(流)为指向所要关闭文件的文件指针;②int表示函数返回值类型,如果文件关闭成功则返回0,关闭失败则返回EOF(-1)。
文件的打开方式:
文件使用方式 | 含义 | 如果指定文件不存在 |
"r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
"w"
(只写)
|
为了输出数据,打开一个文本文件
|
建立一个新文件 |
"a"
(追加)
|
向文本文件尾添加数据
|
建立一个新文件 |
"rb"(只读)
|
为了输入数据,打开一个二进制文件
|
出错 |
"wb"(只写)
|
为了输出数据,打开一个二进制文件
|
建立一个新文件 |
"ab"(追加)
|
向一个二进制文件尾添加数据
|
出错 |
"r+"(读写)
|
为了读和写,打开一个文本文件
|
出错 |
"w+"(读写)
|
为了读和写,建议一个新的文件
|
建立一个新文件 |
"a+"(读写)
|
打开一个文件,在文件尾进行读写
|
建立一个新文件 |
"rb+"(读写)
|
为了读和写打开一个二进制文件
|
出错 |
"wb+"(读写) |
为了读和写,新建一个新的二进制文件
|
建立一个新文件 |
"ab+"(读写) |
打开一个二进制文件,在文件尾进行读和写
|
建立一个新文件 |
对于任意一个C程序,只要运行起来,就默认打开三个流:
stdin — 标准输入流 — 键盘
stdout — 标准输出流 — 屏幕
stderr — 标准错误流 — 屏幕
以上这些流都是FILE*型的。
以下为文件打开和关闭的一个示例:
#include <stdio.h>int main (){FILE * pFile;//打开文件pFile = fopen ("myfile.txt","w");//文件操作if (pFile!=NULL){fputs ("fopen example",pFile); //文件写入//关闭文件fclose (pFile);pFile = NULL;}