文章目录
按照一分钟300字阅读速度,本文阅读需要15min 左右
什么时候使用文件?
在使用计算机的时候,我们是离不开各种各样的文件的
比如 word 文件,txt文件,如果不是出现了什么特殊情况,比如电脑重装啥的,自己不去删除文件,文件就会一直在那不会丢。
所以,当我们要使用程序来长时间保存数据,不至于说程序关闭后,必要的数据就消失了,
这种感觉就和辛辛苦苦写了 ppt但是最后没保存一样难受了,这个时候就需要使用文件
我们无论是读文件还是写文件,都可以叫做文件的基本操作(名字我自己取的)
文件的基本操作
程序如何实现读写文件
首先,我们得知道,文件是什么?放在什么地方?程序是如何操作文件的?
文件可以分为程序文件和数据文件
他们都是放在磁盘里的,也就是说磁盘的文件就是我们通俗所说的文件
不是放在内存中的,也不是放在其他奇怪的地方
程序文件
程序文件就是用来构建程序的文件,像我们写的源文件 main.c , windows 的 .exe文件,这些打开 visual 的 project 就能看到 ,叫做程序文件
数据文件
储存数据的文件,相对于构建程序的文件,这种构建于程序外部的文件且通常用来保存程序读写的数据,所以称为数据文件,我们讨论的都是数据文件
文件名
无论是数据文件还是程序文件,都有文件名
但是文件名不是 一个自定义名+文件类型
而是要加上他的路径
比如你的C盘的闲来无事文件夹有一个boring.txt文件
他的文件名应该是
c:\闲来无事\boring.txt
txt ,也就是后缀名,不是必须存在的,但是如果有,就决定了他的默认打开方式
顺序读写
程序如何操作文件?
程序如何操作文件,我们可以知道,程序能够直接操作内存
我们有一种方式操作文件,就是把所用的文件复制到内存中,然后操作完后再写回到文件里面
但是是这样的吗?
似乎不是
程序不会导入文件所有信息,而是让系统在内存开辟一个文件信息区来储存对应的文件信息(这些信息是有选择的,看看下面的代码),这些信息的类型使用结构体变量FILE来保存,通过这个 FILE 变量来操作文件
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _charbuf;
int _bufsiz;
int _file;
char *_tmpfname;
};
typedef struct _iobuf FILE;
有了这个结构体,我们打开和关闭文件的操作就能够实现
实现的函数分别是 fopen 和 fclose
如果我们要以只读的形式打开一个 项目文件下的 txt 文件,可以这么写
int main()
{
FILE* pF = fopen("text.txt","r");
//对读取出来
fclose(pF);
pF = NULL;
return 0;
}
每次打开文件,都会有一个 FILE 类型的变量诞生,就需要用一个指针储存起来
每次关闭,就用空间释放,指针相对就应该为空指针
但是我们打开的文件是不能乱来的
比如你要写文件,你就不能用读文件的模式打开,你要别人对这个文件只能读,不能写,你的程序就不能越过这个权限,所以 fopen 就规定了打开的方式
读写的函数
当我们打开文件后,重要的不是文件本身,是要能够对文件进行操作,而文件唯二的操作就是读和写
关于文件读写的函数有分类有 单个字符的读写,一行字符的读写,带格式的读写,二进制的读写
我们可以先看看所有的读写函数(如果觉得有些复杂,可以先跳过这里,直接看顺序读写)
然后我们再分类认识
函数名 | 返回值 | 参数 |
---|---|---|
fgetc | int(读取失败是 EOF,成功返回读取的字符的asc码) | (FILE* stream) |
fputc | int(写入失败是 EOF,成功返回读取的字符的asc码) | ( int character, FILE * stream ) |
fgets | char *(成功返回 字符串, 失败返回NULL) | ( char * str, int num, FILE * stream ) |
fputs | 成功返回非负数,失败返回 EOF) | ( con |