概念
这两个函数均用来打开文件后,建立文件缓冲区,而不使用fopen()函数打开文件设定的默认缓冲区。
原型为:
void setbuf(FILE *stream,char *buf);
void setvbuf(FILE *stream,char *buf,int type,unsigned size);
setvbuf函数
共有四个参数,
stream就是file handler;
buf就是buffer pointer,Null时,会根据buffer size自动申请一串buff space;
-
mode有三种:
- _IOFBF(buff满了或fflush才会执行一次IO);
- _IOLBF(出现new line才会执行一次IO);
- _IONBF (无缓冲,接到一个指令执行一次IO);
size就是申请buffer的长度;
setbuf函数
相当于setvbuf的简略版,且当buffer满了或者调用fflush才执行IO。
buf指出的缓冲区长度由头文件stdio.h中定义的宏BUFSIZE的值决定,缺省值为512字节;
当选定buf为空时,setbuf函数将使的文件I/O不带缓冲。
More
缓存区最后一次刷新:是在主程序完成之后,库将控制权交回操作系统之前。
(非静态变量或动态分配空间时,缓存区会被释放,从而最后一次刷新内容会丢失!!!)
#include <stdio.h>
void main(){
int c;
static char buf[BUFSIZ];
setbuf(stdout,buf);
while((c=getchar())!=EOF)
putchar(c);
}
reference
3.C陷阱与缺陷