标准输出的缓存问题

今天在编写一道算法问题的代码时,遇到一个和输入输出缓冲有关的问题。代码如下:

/*
 * test_stdout.c
 *
 *  Created on: 2013-4-20
 *      Author: Administrator
 */

#include 

int main()
{
	int a;

	printf("Please input a value:");
	scanf("%d", &a);
	printf("The value of a is: %d\n", a);

	return 0;
}

执行结果如下:

3
Please input a value:The value of a is: 3

起初我很奇怪为什么调用printf函数的打印为什么会出现在输入变量a的动作之后,但是后来在他们之间加了一段代码后,终端输出逻辑就正常了。代码如下:

#include 

int main()
{
	int a;

	printf("Please input a value:");
	fflush(stdout);
	scanf("%d", &a);
	printf("The value of a is: %d\n", a);

	return 0;
}
执行结果如下:

Please input a value:3
The value of a is: 3

于是在网上google了一下fflush,这个函数的作用是用来清空缓冲区的,在我们这里是清空的输出缓冲区。我们都知道stdout通常跟终端相连,通过描述符1。 如果在运行之前被重定向到非终端,那么printf会进行全缓冲,否则对一行缓冲。如果我们希望在终端及时的看到输出,那么我们需要调用该函数fflush。当然由于stdout默认是是行缓冲的,遇到\n就写内容清缓存,我们也可以采用在输出字符串末尾添加一个换行符。关于这个问题,CSDN的论坛上有一篇帖子讲的也挺详细的,给出链接如下:http://bbs.chinaunix.net/thread-693309-1-1.html

输入输出的问题还有很多,这里只是将自己在编写代码时偶然遇到的问题记录以备以后查阅。


你可能感兴趣的:(C/C++编程)