Ch 5 标准 IO stdio.h

缓冲区分配,以优化的块长度执行 IO,这些处理使得用户不必担心如何选择使用正确的块长度

当用标准IO库打开或创建一个文件时,我们已使一个流与一个文件相关联

流的定向:决定了流是读写单字节还是多字节字符集 初始的流并没有定向,如果使用多字符IO函数,则自动设为多字符定向,单字符同理

freopen 可以清除定向,fwide 可以设置流的定向 标准输入,输出,错误输出是典型的 3 个预定义好的流

标准库缓冲

提供自适应缓冲的目的是减少 read 和 write 的次数

  1. 全缓冲:写满缓冲区才进行 io 操作,一般对于磁盘上的文件都是实施全缓冲的。使用 flush 将缓冲区的内容(可能没有满)写入磁盘
  2. 行缓冲,在输入输出遇到换行符(或缓冲区满)的时候才执行IO操作,终端通常使用行缓冲。从一个不带缓冲的流中输入需要从内核获取数据
  3. 无缓冲。使得信息更快显示出来,标准错误流就是无缓冲的

标准规定:标准错误是不带缓冲的;若是指向终端设备的流,则是行缓冲。否则全缓冲

如果在函数内分配了自动变量类的标准IO缓冲区,那么在关闭流的时候,库将自动释放缓冲区

读流和写流

读写操作:

  • 每次一个字符 IO
  • 每次一行 IO
  • 直接 IO:读写对象,结构

fgets 和 fputs 必须自己处理换行符

格式化IO

输出 printf 到标准输出 fprintf 写到指定流 dprintf 写指定描述符 sprintf 将格式化字符送入缓冲区数组,但是可能会溢出 snprintf 如果超过缓冲区,后续字符会被截断

输入 scanf fscanf sscanf

临时文件

tmpfile 的实现 先调用 tmpnam 产生唯一的路径名,然后用该路径创建一个文件并立即 unlink 它,这样在程序退出的时候 close 文件时才会删除其内容,达到临时使用文件的用途

内存流

有的标准输入输出流并没有对应打开的硬盘文件,所有操作都是与内存中buffer进行数据交换,这些流被叫做内存流

因为缓冲区会自动增长,因此避免了缓冲区溢出,内存流非常适用于创建字符串,比临时文件的性能要好