我们知道,标准缓冲提供缓冲的目的 是 尽可能减少使用posix.1的read,write函数调用次数。
标准I/O库提供了三种类型的缓冲:
1 全缓冲:
在填满I/O缓冲后才进行实际I/O操作。(读写磁盘属于此类缓冲,用来避免重复擦写磁盘扇区的次数)。flush说明标准I/O缓冲区的写操作。
2 行缓冲:
当输入和输出中遇到换行时,标准I/O库执行I/O操作。这允许我们一次输出一个字符(用标准I/O fputc函数),但是只有些了一行之后才进行实际I/O操作。(当流涉及一个终端时,如标准输入和标准输出,通常使用行缓冲)
3 不带缓冲:
标准I/O库不对字符进行缓冲储存。(即直接写入流)
下列函数用于更改缓冲类型:
#include<stdio.h>
void setbuf(FILE *restict fp,char *restrict buf);
int setvbuf(FILE *restrict fp,char *restrict buf,int mode,size_t size);
返回值:若成功则返回0,若出错则返回非0值
setbuf函数打开或关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ(stdio.h头文件中定义)。通常在此之后流就是全缓冲的,为了关闭缓冲,将buf设置buf为NULL
setvbuf函数,可以精确地指出所需的缓冲类型。这是用mode参数实现的。
_IOFBF 全缓冲
_IOLBF 行缓冲
_IONBF 不带缓冲
如果设定_IONBUF的情况下,忽略buf和size参数设定。如果设定带缓冲的,而buf为NULL那么标准I/O将自动地为该流分配适当长度的缓冲区,根据BUFSIZ定义。
《unix环境高级编程》
标准I/O库提供了三种类型的缓冲:
1 全缓冲:
在填满I/O缓冲后才进行实际I/O操作。(读写磁盘属于此类缓冲,用来避免重复擦写磁盘扇区的次数)。flush说明标准I/O缓冲区的写操作。
2 行缓冲:
当输入和输出中遇到换行时,标准I/O库执行I/O操作。这允许我们一次输出一个字符(用标准I/O fputc函数),但是只有些了一行之后才进行实际I/O操作。(当流涉及一个终端时,如标准输入和标准输出,通常使用行缓冲)
3 不带缓冲:
标准I/O库不对字符进行缓冲储存。(即直接写入流)
下列函数用于更改缓冲类型:
#include<stdio.h>
void setbuf(FILE *restict fp,char *restrict buf);
int setvbuf(FILE *restrict fp,char *restrict buf,int mode,size_t size);
返回值:若成功则返回0,若出错则返回非0值
setbuf函数打开或关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ(stdio.h头文件中定义)。通常在此之后流就是全缓冲的,为了关闭缓冲,将buf设置buf为NULL
setvbuf函数,可以精确地指出所需的缓冲类型。这是用mode参数实现的。
_IOFBF 全缓冲
_IOLBF 行缓冲
_IONBF 不带缓冲
如果设定_IONBUF的情况下,忽略buf和size参数设定。如果设定带缓冲的,而buf为NULL那么标准I/O将自动地为该流分配适当长度的缓冲区,根据BUFSIZ定义。
《unix环境高级编程》