标准I/O库提供缓冲的目的是尽可能的减少read和write调用的次数。
标准I/O提供了3种类型的缓冲:
(1)全缓冲:在这种情况下,只有在填满标准I/O缓冲区之后才进行实际I/O操作。
(2)行缓冲:在这种情况下,当输入和输出遇到换行符时,标准I/O库执行I/O操作。(如果缓冲区被填满,无论有无换行符都进行I/O操作)。
(3)不带缓冲:标准I/O库不对字符进行缓冲存储。
标准错误刘stderr通常是 不带缓冲的。
对于任何一个给定的流,如果我们并不喜欢这些系统默认,则可调用下列两个函数中的一个更改缓冲类型。
#include <stdio.h> void setbuf(FILE *restrict fp, char *restrict buf); int set buf(FILE *restrict fp, char *restrict buf,int mode, size_t size); 返回值:若成功,返回0;若出错,返回非0 |
---|
这些函数一定要在流已经被打开之后调用,而且也应该在对流执行任何一个其他操作之前调用。
可以使用setbuf函数打开或关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ的缓冲区。
若需要关闭缓冲,可将buf设置为NULL。
使用setvbuf,可以用mode参数精确说明所需的缓冲类型。
_IOFBF 全缓冲
_IOLBF 行缓冲
_IONBF 不带缓冲
如果指定一个不带缓冲的流,则忽略buf和size的参数。
斜土列出了这两个函数的动作,以及它们的各个选项。
任何时候我们都可以强制冲洗一个流。
#include <stdio.h> int fflush(FILE *fp); |
---|
此函数使该流所有未写的数据都被传送至内核。作为一种特殊情况,若fp为NULL,则该函数将导致所有输出流被冲洗。