文件操作
1. 文件的存储
(1) 文件主要存在磁盘(外存)上.
(2) 内存外存的区别:
内存比较小,外存比较大;
内存访问速度快,外存比较慢;
内存比较贵,外存更便宜一些;
内存如果掉电了数据就会丢失,外存掉电了数据还在;
直接操作外存不像内存那么方便,操作外存是通过"文件"方式进行操作的;
(3)一般我们通过路径来确定唯一的文件
- d:开头的路径,叫"绝对路径"
- . 或者…开头的路径,叫"相对路径",相对路径必须要指定一个当前目录,以当前目录为基础,就可以确定相对路径对应的文件了.
2. 文件类型
(1)文本文件( .c文件)
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符的形式存的文件就是文本文件.
(2)二进制文件( .exe文件)
数据在内存中以二进制形式存储,如果不加转换就输出到外存就是二进制文件.
3. 文件的四个核心操作
(1)打开文件fopen
FILE* fopen(const char* filename,const char* mode)
注:此处的FILE是定义好的结构体指针,后续操作文件,就是通过FILE来操作的;FILE结构体就类似于磁盘的遥控器,操作FILE结构体就能影响盘,FILE结构体和磁盘文件具有一定的联系,这个联系是操作系统内核帮我们自动完成的.
<1> 关于fopen中的打开方式:
- 操作文本文件
" r "(只读):为了输入数据,打开一个已经存在的文本文件.
" w "(只写):为了输出数据,打开一个文本文件.
" a "(追加):向文本文件尾添加数据.
" r+ "(读写):为了读和写,打开一个文本文件.
" w+ “(读写):为了读和写,建一个新的文件.
" a+”(读写):打开一个文件,在文件尾进行读写.
注:使用"w"方式打开会先清空原来内容,"a"方式打开不会影响原来内容,会在旧内容后面新增新内容. - 操作二进制文件
" rb "(只读):为了输入数据,打开一个二进制文件.
" wb "(只写):为了输出数据,打开一个二进制文件.
" ab "(追加):向一个二进制文件尾添加数据.
" rb+ "(读写):为了读和写,打开一个二进制文件.
" wb+ "(读写):为了读和写,新建一个二进制文件.
" ab+ "(读写):打开一个二进制文件,在文件尾进行读和写.
<2> 打开文件时可以使用errno来检查打开成功还是失败,errno是0就是成功,非0就是不成功,不同的errno值表示不同的出错原因,可以通过搜索引擎查到具体的原因这个方式比较麻烦,更简单的办法就是可以使用strerror这个函数.
(2) 关闭文件fclose - 一旦打开文件就需要用fclose关闭文件,否则就会出现类似"内存泄漏"的效果称为"文件资源泄漏";"文件资源泄漏"的本质原因是因为一个进程能打开的文件个数有限,这是一个很严重的问题,一旦出现就会导致程序不能正常工作.
- 在windows上默认打开文件的个数是512个,而我们看到的结果确是509个因为一个进程会默认打开三个文件,标椎输入stdin(对应键盘),标准输出stdout(对应显示器),标椎错误stderr(对应显示器).
(3)读文件fread
size_t fread (void* ptr,size_t size,size_t count,FILE* stream)
注: 如果文件读取失败size就会和count不相同.
(4) 写文件fwrite.
4. 文件缓冲区
计算机中访问磁盘的速度远远慢于内存的(差3~4个数量级),如果直接去访问磁盘,程序的整个效率就会低很多.如果要写很多的数据,不需要每个字节都访问一次磁盘,而是把要写的数据先放在内存里,攒一波,在统一写进磁盘里,此时整个用来辅助进行读写磁盘的内存空间,就称为"缓冲区".