文章目录
1.什么是文件
磁盘中的文件是文件,键盘是文件,显示器也是文件,所以有一句话叫做一切皆文件。
但是从程序设计角度来说,文件一般有两种,程序文件和数据文件;
程序文件:包含源程序文件(.c后缀),目标文件(windows环境后缀.obj),可执行文件(windows环境.exe);
数据文件:程序运行时读取或输出的数据;
接下来谈的主要是数据文件;
2.为什么使用文件
程序运行时数据都是保存在内存之中,当退出程序这些数据就会消失;比如通讯录小程序,我们输入了联系人信息,一旦退出又要重新输入数据,这样的通讯录就没有了意义。而当我们退出程序将数据保存在磁盘文件之中,运行程序时再将数据读取出来,这样就将信息做到了持久化保存;
3.文件名
我们使用一个文件必须知道这个文件的名字,一个文件名通常包含3个部分:文件路径+文件名主干+文件后缀;
比如:e\project\file.log
文件路径:e盘之中的project 文件名主干:file 文件名后缀:log
4.如何使用
要使用文件,首先我们要将一个文件打开,文件打开的函数是:FILE * fopen ( const char * filename, const char * mode );;
形参列表之中:filename表示的是打开文件的名字,mode表示的是打开的方式是读取还是写入。返回值是一个文件指针,下面来演示一下:
上面进行了初步的演示,接下来我将继续介绍文件指针,文件的读写方式;
5.文件指针
上面打开文件演示中的FILE *fp即定义的文件指针变量,用来接收文件信息区的地址,通过这个指针变量就可以访问到与文件信息对应的文件;
6.文件的使用方式
文件使用方式 | 含义 |
---|---|
“r” | 为输入打开一个文本文件 |
“w” | 为输出打开一个文本文件 |
“a” | 向文本文件尾增加数据 |
“rb” | 为输入打开一个二进制文件 |
“wb” | 为输出打开一个二进制文件 |
“ab” | 向二进制文件尾增加数据 |
“r+” | 为读/写打开一个文本文件 |
“w+” | 为读/写建立一个新的文本文件 |
“a+” | 打开一个文件在文件尾进行续写 |
“rb+” | 为读/写打开一个二进制文件 |
“wb+” | 为读/写建立一个新的二进制文件 |
“ab+” | 打开一个二进制文件,在文件尾进行读和写 |
上述表格看起来复杂,其实只要知道:
1.w对应的是文本文件的输出,是覆盖式写入,当打开的文件不存在时会创建一个文件。
下面动图展示了“w”方式的覆盖式写入
2.r对应的是文本文件的输入,当打开的文件不存在时会打开失败。
3.是对文本文件进行续写,是在文件末尾续写,当打开文件不存在时会打开失败。
经过验证,在vs2013,当打开文件不存在时也会自动创建一个新的文件;下面动图演示“a”在文件尾进行续写
4.b对应的是二进制文件,只要在上述四种方式后面加上b就是对应的二进制文件;
5.“+”表示的是读写一体,同样只要在上述方式后端添上“+”;
7.文件的读写函数
下面演示两个字符输入函数的使用;
7.1getc演示:
7.2fputc演示:
8.文件指针调整函数
8.1 fseek:根据文件指针的位置和偏移量来定位文件指针
演示:
9. long int ftell(FILE stream):返回文件指针相对于起始位置的偏移量
10.rewind:读写位置恢复到最开始
11.文本文件和二进制文件
文本文件:对人友好,将文件内容转化为对应的ASCII码值对应的符号
二进制文件:直接将对应的补码储存到文件之中,即内存里面什么样,文件之中也是什么样
12.文件读取结束的判定feof
文件读取结束的判定
文本文件的判定:
在使用feof的使用必须让文件一直读取,读取到出错再用feof判断返回值是否为文件的结尾;
fgetc判断是否为EOF,fgets判断是否为NULL;
因为文件读取出错的时候也有可能返回EOF,即因为其他因素而导致结束读取,这时候就需要用feof来判定返回值EOF是否为读取结束;
演示:
二进制文件读取结束判定
二进制文件的读结束判定为:判定返回值是否小于实际要读的个数
因为当fread读取返回值一直等于要读取的个数(满足期望值)即会一直读取下去,当返回值小于期望值时就不会再读了;
成功演示
失败演示
13.文件缓冲区
先上理论:
c语言默认提供缓冲机制
常见缓冲机制有:无缓冲,行缓冲,全缓冲
普通文件写入采用全缓冲
显示器文件写入采用行缓冲
所谓的缓冲区本质就是一块内存,存在的最大价值就是为了提升程序的效率;
引申
因为缓冲区的存在,需要刷新缓冲区或者文件操作结束的时候关闭文件,否则可能导致文件读写问题