笔记整理自哈尔滨工业大学的MOOC课程:C语言程序设计精髓
第十二章 文件操作
文件
* 存储在外部介质上具有名字的一组相关数据的集合
* 数据一般以文件的形式为用户及应用程序使用
* 使用文件的好处
* 程序与数据分离
* 数据共享
* 长期保存数据
文件是如何组织的
文件的分类
流式文件
输入/输出重定向
文件的分类
文本文件和二进制文件
二进制文件的特点
二进制文件保存数据,不仅要按照存入时的类型,还要按存入时的格式读出,才能恢复其本来面貌
文件与流的关系
文件指针
文件的打开
w和a的区别
r+和w+的区别
文件的关闭
按格式读写文件
按字符读写文件
其实这四个函数都是作为宏来实现的:
作为宏来实现的好处是执行速度快,省去了函数调用所需要的开销
但是带参数的宏存在诸如没有类型检查等缺陷,所以设计者设计了fputc,fgetc这样的作为函数而不是作为宏来实现的库函数,作为函数的备选。
为何返回值为int,而非char?
因为这几个函数都是通过EOF这个符号常量来说明文件末尾的,或者是说明发生了读写错误的。
这几个函数检测到文件尾或者发现文件出现了读写错误时,函数都返回EOF。EOF在stdio.h中定义为-1。
因为并非所有的编译器都把字符型当做有符号整型来处理的,因此这几个函数在读取字符的时候如果把函数的返回值保存在一个字符型变量中,不是一个整型变量中,那么在判断是否到达文件末尾,或者是否发生读写读写错误的时候,就需要将函数的返回值与EOF进行比较。而将函数返回的字符型数据的值与EOF进行比较的的时候,就有可能产生错误的结果。
为什么用符号常量EOF而不直接使用常数-1呢?
因为标准C只是将EOF定义成了一个负的整型常量,并不一定是-1,在不同的系统中,EOF可能会取不同的值,所以才用符号常量而不是-1来检测文件输入数据是否结束,可以增加程序的可移植性。
尽管第一个参数c被定义为整型,但是在向文件写入这个字符的时候,只写入它的第一个字节
按行写文件
按行读文件
按数据块读写文件
文件的随机读写
文件缓冲
两种方式的不同