前言
在程序运行中,大部分的数据都在内存中被运行或者被调用,若是程序结束运行后,程序在内存中申请的内存空间就会被释放,或者被操作系统回收;但是往往许多程序需要将数据保存,例如游戏存档,通讯录…;但是有什么方法能将内存中的数据保存起来呢?
若是想将数据存储起来,可以使用文件将数据保存。
什么是文件
文件在程序设计中一般分为两种,即程序文件与数据文件;(从文件的功能角度进行分类)
程序文件
- 程序是为完成某项活动所规定的方法
- 描述程序的文件即为程序文件
例如:
源程序文件、目标文件、可执行程序等;
数据文件
然而并不是所有文件的内容都是程序,也有可能是程序运行时读写的数据,例如程序运行需要从文件中读取数据,或者是将数据存储在文件中。
文件信息区
计算机在每个文件被使用时,都会为文件开辟一块空间,这块空间被称为文件信息区,这块空间一般被用来存放文件的文件名,文件大小,文件位置等信息;
每一块文件信息区都会被与其对应的文件绑在一起,换另一种说法即为,每个文件都会存在一块对应的文件信息区。
打开文件与关闭文件
将大象塞进冰箱的方法有三步,将冰箱门打开,把大象塞进去,再将冰箱关上;
文件也是如此,在进行的读或是写时,首先要先将文件打开,再相应的进行读或是写的动作,最后使用过后再将文件关闭。
打开文件 - fopen函数
既然要进行打开文件与关闭文件的操作,应该如何打开文件?
在c语言中,存在着这么一个函数 ;
- fopen函数
该函数的返回值为FILE*
FILE* 类型为c语言<stdio.h>文件中的一个结构体类型,是管理文件流的一种结构;
该函数若是将文件打开成功返回一个FILE*的指针,
若是打开失败则返回空指针;
该函数共有两个参数:
- const char * filename
该参数为文件名,即包含要打开的文件名的字符串;
要打开的文件在项目中即可直接使用文件名(+文件后缀);
若是要打开的文件存在于其他目录中,则需要使用绝对路径或是相对路径才能对其进行访问 ; - const char * mode
该参数为文件访问模式的字符串,使用者根据不同的需求使用不同的访问模式对文件进行访问:
文件使用方式 | 含义 | 如果指定文件不存在 |
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
同时,该函数在打开文件时可能会出现打开文件失败,若是打开文件失败,则需要及时将程序停止,否则则会对空指针NULL进行非法访问:
FILE*pt = fopen("text.txt", "r");//以只读的形式打开文件 if (pt == NULL) {//判断返回值FILE*指针是否为空指针 perror("Fopen");//利用perror函数打印错误信息 return 1;//提前结束函数 }
关闭文件 - fclose函数
在操作完文件时应及时关闭文件,相应的除了打开文件的函数还有关闭文件的函数;
- fclose函数
该函数的返回值为 int
若是关闭文件成功则返回0;
若是关闭文件不成功则返回EOF(文件结束标志,值为-1);
该函数只有一个参数 - FILE* stream
即指向指定要关闭的流的 FILE* 对象的指针。
在使用完文件后应及时将文件关闭,并将FILE*指针置空,避免野指针的出现;
int main() { //打开文件 FILE* pt = fopen("text.txt", "w");//以只写的模式打开文件text.txt if (pt == NULL) {//判断返回值FILE*指针是否为空指针 perror("Fopen");//利用perror函数打印错误信息 return 1;//提前返回函数 } //操作文件 //关闭文件 fclose(pt);//关闭文件 pt = NULL;//将指针置空避免野指针的出现 return 0; }
总结
- 打开文件后对FILE*进行判断
使用fopen函数打开文件时,应对FILE指针进行判断,判断打开文件是否成功,若是成功则返回一个FILE的指针,若是打开失败则返回空指针;若是不对 FILE * 指针进行判断,则可能会出现对空指针的一个非法访问。 - 打开文件前应确认路径
使用fopen函数打开文件时应提前对文件的路径进行确定,若需要打开的文件存在于项目中,则可以直接使用文件名;若是文件不存在于项目中(其他路径),则需要使用相对路径或是绝对路径,否则可能出现打开文件失败。 - 打开文件前应确认文件名
在打开文件前除了要对路径进行确定,同时也要对文件的文件名进行确定,在计算机中可能会出现隐藏文件名后缀的现象,若是在使用fopen函数打开文件时没有将文件的正确文件名作为参数则也会出现打开文件失败。 - 操作完文件时应该及时关闭文件
在使用完文件过后应及时将文件关闭,若是不及时关闭文件,可能会导致数据丢失,在计算机中存在着一个区域叫作缓冲区,文件的读写并不是直接进行读写,而是以输入缓冲区(输出缓冲区)为一个中转站,在使用fclose函数关闭文件时,会先将缓冲区的数据写入文件中再撤销缓冲区。 - 关闭文件后应及时置空指针
在使用fclose函数关闭文件后,应及时将指针置空NULL,否则将出现野指针,野指针的概念即为指向一个随机内存空间的指针,这个指向可能是没有被初始化或是指向已经被释放的内存空间。