Ch 5 标准 IO stdio.h
缓冲区分配,以优化的块长度执行 IO,这些处理使得用户不必担心如何选择使用正确的块长度
当用标准IO库打开或创建一个文件时,我们已使一个流与一个文件相关联
流的定向:决定了流是读写单字节还是多字节字符集 初始的流并没有定向,如果使用多字符IO函数,则自动设为多字符定向,单字符同理
freopen 可以清除定向,fwide 可以设置流的定向 标准输入,输出,错误输出是典型的 3 个预定义好的流
标准库缓冲
提供自适应缓冲的目的是减少 read 和 write 的次数
- 全缓冲:写满缓冲区才进行 io 操作,一般对于磁盘上的文件都是实施全缓冲的。使用 flush 将缓冲区的内容(可能没有满)写入磁盘
- 行缓冲,在输入输出遇到换行符(或缓冲区满)的时候才执行IO操作,终端通常使用行缓冲。从一个不带缓冲的流中输入需要从内核获取数据
- 无缓冲。使得信息更快显示出来,标准错误流就是无缓冲的
标准规定:标准错误是不带缓冲的;若是指向终端设备的流,则是行缓冲。否则全缓冲
如果在函数内分配了自动变量类的标准IO缓冲区,那么在关闭流的时候,库将自动释放缓冲区
读流和写流
读写操作:
- 每次一个字符 IO
- 每次一行 IO
- 直接 IO:读写对象,结构
fgets 和 fputs 必须自己处理换行符
格式化IO
输出 printf 到标准输出 fprintf 写到指定流 dprintf 写指定描述符 sprintf 将格式化字符送入缓冲区数组,但是可能会溢出 snprintf 如果超过缓冲区,后续字符会被截断
输入 scanf fscanf sscanf
临时文件
tmpfile 的实现 先调用 tmpnam 产生唯一的路径名,然后用该路径创建一个文件并立即 unlink 它,这样在程序退出的时候 close 文件时才会删除其内容,达到临时使用文件的用途
内存流
有的标准输入输出流并没有对应打开的硬盘文件,所有操作都是与内存中buffer进行数据交换,这些流被叫做内存流
因为缓冲区会自动增长,因此避免了缓冲区溢出,内存流非常适用于创建字符串,比临时文件的性能要好