标准I/O库之缓冲

于 2012年03月4日 发布在 linux应用 跳到评论

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

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

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

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

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

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

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

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

#include<stdio.h>

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 );
	/*
	*以下是由gnu标准IO定义的,不同系统可能会又不同实现。
	*/

	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 );
}

本文共有 3条评论 | 沙发:文章评论

  1. sinners说道:

    看看这个http://topic.csdn.net/u/20100427/13/2e7fb4a8-8b07-4375-a888-dfa64225ae48.html

留下评论!

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)