标准I/O库之缓冲

标准io提供缓冲的目的是尽可能减少read和write的调用。他对每个流进行缓冲管理,减少了编码的复杂度。标准IO库提供了三种类型的缓冲。

1.全缓冲。当缓冲区填满之后才进行实习操作,驻留在磁盘上的文件通常都是全缓冲的。在第一个流上执行第一次io操作时,相关函数用malloc获得所需的缓冲区。

2.行缓冲。在输入和输出中遇到换行符的时候,标准库执行IO操作。当流涉及到一个终端的时候,通常使用行缓冲。

3.不带缓冲。标准IO库不对字符进行缓冲储存,stderr通常时不带缓冲的,这就可以使出错信息可以尽快显示出来。

当且仅当标准输入和标准输出并不涉及互交式设备时候,流才是全缓冲的。

标准出错输出不会是全缓冲的。

可以用setbuf,setvbuf更改流的类型。

下面有个程序很好的解释了以上:

#include

void pr_stdio( const char *, FILE * );

int main(void){

FILE *fp;
fputs(“enter any character\n”, stdout );
if( getchar() == EOF )
fputs(“getchar error\n”, stderr );

fputs(“one line to standard error”,stderr );

pr_stdio( “stdin”, stdin );
pr_stdio( “stdout”, stdout );
pr_stdio( “stderr”, stderr );

if( (fp=fopen(“/etc/motd”, “r”)) != NULL )
fputs(“fopen error”, stderr );
if( getc(fp) == EOF )
fputs(“getc error\n”, stderr );
pr_stdio(“/etc/motd”,fp);

return 0;
}

void pr_stdio( const char *name, FILE *fp ){
printf(“stream = %s “, name );
/*
*Not Portable
*/

if( fp->_IO_file_flags & _IO_UNBUFFERED )
printf(“unbuffered”);
else if( fp->_IO_file_flags & _IO_LINE_BUF )
printf(“line buffered”);
else
printf(“fully buffered”);
printf(“, buffer size = %d \n”,
fp->_IO_buf_end – fp->_IO_buf_base );
}

关于 “标准I/O库之缓冲” 的 3 个意见

发表评论

电子邮件地址不会被公开。