【APUE】标准IO库
1. 缓冲:缓冲的目的是尽可能的减少read或write的次数
- 全缓冲:填满缓冲区后才尽心实际IO操作
- 行缓冲:输入和输出遇到换行符的时候,执行IO操作,通常在流涉及终端的时候使用(标准输入和标准输出),在缓冲区满的时候,即使没有换行符,也进行IO操作
- 不带缓冲:立即输出,标准错误流stderr通常是不带缓冲的
2. IOS C标准:
- 当且仅当标准输出和标准输入不指向交互式设备时,才能是全缓冲
- 标准错误绝不会是全缓冲
3. 打开流
- Unix环境中使用b作为type的一部分[fopen(file, rb) OR freopen(file, ab+)]实际上没有作用,因为Unix内核并不区分文本文件和二进制文件
- 进程正常终止(exit或者从main return)所有未带写缓冲数据的标准IO流都将被冲洗(放弃)
- getc和fgetc的区别在于,getc可以被实现为宏:
- getc的参数不能是有副作用的表达式
- fgetc一定是个函数,一定可以得到地址,可以作为参数传递
- fgetc的调用时间可能比getc长(函数调用的时间通常长于宏)
4. 二进制流ß
fread和fwrite 可以一次读写一个完整的结构,但是只能用于同一个系统上读写数据,这是因为:
- 在不同的系统中可能因为系统和编译程序的不同而导致结构成员偏移量的不同
- 用来存储多字节正数和浮点数的结构在不同的系统上也可能不同