viperchaos

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

关于I/O流,初学会碰到一些很奇怪的现象。程序如下:

int main() 
{ 
    while(1) 
    { 
        fprintf(stdout,"hello-out"); 
        fprintf(stderr,"hello-err"); 
        sleep(1); 
    } 
    return 0; 
} 

在终端下屏幕只是输出的只有hello-err,而不输出hello-out,非常让人疑惑

把程序稍微改一下:

int main()
{
	while(1)
	{
		fprintf(stdout,"hello-out");
		fflush(stdout);
		fprintf(stderr,"hello-err");
		sleep(1);
	}
	return 0;
}

这次终端屏幕可以输出hello-out和hello-err,ffplush能立即把输出缓冲区的数据进行物理写入,能保证信息实时地打印出来,而

stderr是无缓冲的输出,保证错误提示和输出能够及时反馈给用户,供用户排除错误。在第一个程序中,hello-out写在缓冲区,一直

写到缓冲区满了屏幕才会输出hello-out,而且会输出很多个。

再把程序改一下:

int main()
{
	while(1)
	{
		fprintf(stdout,"hello-out\n");
		fprintf(stderr,"hello-err\n");
		sleep(1);
	}
	return 0;
}

程序也可以输出hello-out和hello-err,这说明标准输出是行缓冲,遇到”\n”,就会进行I\O操作,这样也能及时地输出信息。

既然说到了fflush,那就再啰嗦一下,我们常见的调试策略是把一些printf函数散布于程序中,确定错误出现的具体位置。但是,这些

函数调用的输出结果被写到缓冲区中,并不立即显示在屏幕上。解决方法是priintf函数之后紧跟fflush函数

printf("somgthing is wrong?");

fflusn(stdout);

参考资料:

1.《C和指针》  P299

2.http://hi.baidu.com/hp_roc/blog/item/47eedcef85e2b7dfb31cb19e.html

posted on 2010-12-08 01:11  viperchaos  阅读(254)  评论(0)    收藏  举报