😀 前言
前面写的程序都是一闪即逝,只要关闭了程序,就找不到运行的结果。如果想要将运行的结果保存下来,下次运行的时候接着上次运行,只有自己想要删除数据,数据才会消失。这就涉及到了数据持久化的问题, 我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。
现在就学习一下使用文件,我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
🤔 什么是文件
文件是计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)
😶 程序文件
程序文件存储的是程序,包括源程序和可执行程序。
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
😶 数据文件
数据文件比较多,数据的概念也比较广泛图形图像声音数字各种码制都是数据,存储这些数据的文件就是数据文件。
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
本文就是来学习一下数据文件。
以前我们写的代码所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。
但是有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件。
😶 文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:c:\code\test.txt
为了方便起见,文件标识常被称为文件名
🤨 文件指针
文件类型指针简称文件指针。
所谓的文件类型其实就是一个结构体类型:
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.
不同的C编译器的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;
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE
的指针来维护这个FILE
结构的变量,这样使用起来更加方便。结构体变量毕竟太大了。
// demo
FILE* pf; // 文件指针变量
定义pf
是一个指向FILE
类型数据的指针变量。可以使pf
指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
🤫 文件的打开和关闭
使用文件之前需要打开文件,使用完要关闭文件(这个很重要,后面说)。
ANSIC
规定使用fopen
函数来打开文件,fclose
来关闭文件。
😑 fopen
打开文件
函数描述:
filename
:文件名
文件名(路径 + 文件名)。如果没有指定路径,默认是在当前源文件的路径下(相对路径)。
注意: 路径的\
字符需要转义:\\
mod
:打开文件的方式
📙 mod的规律:
文件不存在时:
w
都是创建新的文件,r
都是出错,a
除了ab
都是创建新文件文件存在时:
文件存在并且只是以
w
的形式打开文件(包括wb
)。文件的内容会被清空双重形态
读带上
+
就是读写, 追加和写带上+
就是读写,否则都只能读或者写。
返回值 Return Value
:
如果文件被成功打开,函数将返回一个指向
file
对象的指针。否则,将返回一个空指针。
在大多数库实现中,
errno
变量也设置为失败时的系统特定错误代码。
😑 fclose
关闭文件
函数描述:
关闭文件流stream
。
返回值Return Value
:
如果成功了返回0。
失败返回
EOF
。
// demo
fclose(pf);
pf = NULL