UNIX(编程-基础IO):09---缓冲区与设置缓冲函数(setvuf、setvbuf、fflush)

时间:2024-03-28 10:45:35

一、缓冲区的目的

UNIX(编程-基础IO):09---缓冲区与设置缓冲函数(setvuf、setvbuf、fflush)

二、缓冲区的分类

①全缓冲

  • 概念:当填满缓冲区后才进行实际I/O操作
  • 对于驻留在磁盘上的文件通常是由标准I/O库实施全缓存的

②行缓冲

  • 概念:当遇到换行符时,才执行IO操作
  • 即使没有遇到换行符,但是缓冲区满了也进行刷新缓冲区了

③无缓冲

  • 概念:不进行缓冲,直接进行IO操作

注意事项:

  • 打开至终端设备的流一般是行缓冲
  • 标准错误是无缓冲的
  • 其他都是全缓冲的

三、设置缓冲区

#include <stdio.h>
void setbuf(FILE *restrict fp, char *restrict buf );
int setvbuf(FILE *restrict fp, char *restrict buf, int mode,size_t size);
//返回值:成功返回0;出错返回非0

注意事项

  • 这两个函数一定要在参数1的流打开之后调用 

setbuf

  • 功能:此函数用来将参数1所指向的流进行关闭/打开缓冲机制

使用

  • ①如果参数2位NULL,则参数1所指向的流被设置为无缓冲
  • ②参数buf必须指向于一个长度为BUFSIZ常量的缓冲区(该常量定义在<stdio.h>中),设置之后该流就是全缓冲了。但是如果该流与一个终端设备相关,那么某些系统也可将其设置为行缓存的

setvbuf

  • 功能:此函数提供了各个选项用来设置流的缓冲机制

使用

  • mode为_IOFBF:全缓冲。buf和size指向于一个缓冲区和该缓冲区的大小
  • mode为_IOLBF:行缓冲。buf和size指向于一个缓冲区和该缓冲区的大小
  • mode为_IONBF:无缓冲。buf和size可以忽略

如果该流是带缓存的,而buf是NULL,则标准I/O库将自动地为该流分配适当长度的缓存(适当长度指的是常量BUFSIZ所指定的值)

UNIX(编程-基础IO):09---缓冲区与设置缓冲函数(setvuf、setvbuf、fflush)

注意事项

UNIX(编程-基础IO):09---缓冲区与设置缓冲函数(setvuf、setvbuf、fflush)

四、刷冲缓冲区函数

#include <stdio.h>
int fflush(FILE *fp);
  • 功能:此函数使该流所有未写的数据都被传递至内核。
  • 注意事项:如果fp是NULL,则此函数刷新所有输出流