C语言基础笔记整理(12)
笔记整理自哈尔滨工业大学的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被定义为整型,但是在向文件写入这个字符的时候,只写入它的第一个字节
按行写文件
按行读文件
按数据块读写文件
文件的随机读写
文件缓冲
两种方式的不同