标准文件IO详解---缓冲区详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标准文件IO详解---缓冲区详解相关的知识,希望对你有一定的参考价值。

  标准文件 IO 相比于文件 IO 来说,在用户层中增加了一个用户缓冲区。也就是说在使用标准IO 来操作文件的时候,都会经过此用户层的缓冲区。比如使用标准 IO 来向文件中写入内容的时候,首先内容会首先被写入到用户缓冲区中,等到 缓冲区满 或者 刷新缓冲区 的时候在调用文件 IO 将内容写入到内核中的磁盘缓冲区中。
====================================================
用户缓冲区的类型:
  • 全缓冲
    此种类型的缓冲只有在缓冲区满的时候才会调用实际的文件 IO 进入内核态操作。除了涉及到终端设备文件的流,其它文件流默认基本都是全缓冲。
  • 行缓冲
    此种类型的缓冲在缓冲区满或者遇到 \\n 的时候才会调用实际的文件 IO 进入内核态操作。当流涉及到终端设备的时候就是行缓冲,比如标准输入流和标准输出流。如果对标准输入流或者输出流进行重定向到某个文件的时候,该流就是全缓冲的。
  • 无缓冲
    没有缓冲区。直接调用文件 IO 进入内核态操作。标准错误流默认就是无缓冲的。
====================================================
如果对于某文件我们不想要使用其默认的缓冲区类型,c库还提供了setvbuf函数给我们以便去修改文件流默认的缓冲区类型。
技术分享
技术分享
函数原型:
技术分享
函数参数:
  • stream:要改变缓冲区的文件流指针
  • buf:设置的缓冲区首地址
  • mode:设置的缓冲区类型,当设置为无缓冲时,参数buf和size会被忽略
  • size:设置的缓冲区的大小
返回值:
  • 调用成功时返回 0
  • 调用失败返回 非0值
====================================================
mode参数可以是以下几个宏之一:
  • _IOFBF:全缓冲;如果参数 buf 为NULL,则系统会自动分配适当大小的缓冲区。否则参数 buf 被设置为缓冲区的首地址。
  • _IOLBF:行缓冲;如果参数 buf 为NULL,则系统会自动分配适当大小的缓冲区。否则参数 buf 被设置为缓冲区的首地址。
  • _IONBF:无缓冲;函数会忽略 buf 和 size 这两个参数。

以上是关于标准文件IO详解---缓冲区详解的主要内容,如果未能解决你的问题,请参考以下文章

标准文件IO详解---fclose函数详解

标准IO库(详解)

标准文件IO详解---标准输入流标准输出流和标准错误流

文件IO详解(十五)---syncfsync和fdatasync函数详解

详解文件IO系列讲讲 MQ 消息中间件 (Kafka,RocketMQ等)与 MMAPPageCache 的故事...

Java IO流详解——缓冲流