为什么直到程序结束时才看到屏幕输出?
有时,依赖于所使用的编译程序和操作系统,系统会对输出进行缓冲。“缓冲”是指任何要送到设备上的输出,无论设备是屏幕、磁盘还是打印机,都被存储起来,直到输出量大到足以进行高效的输出。当存储了足够多的输出信息时,再整块地向指定的设备输出。
这种过程会给不了解其作用的程序员带来两个问题。首先,在程序送出输出内容后,它可能要再过一段时间后才会在屏幕上显示出来。如果程序员正在试图跟踪程序的当前运行状态,他就会被这种效果所困扰。
其次,更可怕的是,在程序显示提示信息并等待用户输入时,很可能就会发生问题。当程序试图从用户那里得到输入信息时,输出缓冲区可能还未被“填满”,因此送往屏幕的提示信息可能不会显示出来,用户也就不知道程序已经在等待他进行输入了——他所能得出的结论只能是这个“可爱”的程序突然停止工作了。
如何解决这个问题呢?有两种办法。第一种办法是在程序的开始部分,在进行任何输出之前,加入下述语句:
setvbuf(stdout,NULL,_IONBF,O);
该语句的作用是实现程序到屏幕的无缓冲输出。当这条命令被执行后,每一个被送往屏幕的字符都会立即显示出来。
用这种办法解决这个问题确实比较方便,但是还不够理想。笔者不想在这里对屏幕输入和输出展开一次技术讨论,但笔者要指出这样一点,即对屏幕输出进行缓冲是有充分的理由的,并且你还会希望这样做。
这佯一来,就引出了解决输出缓冲问题的另一种办法。当fflush()命令作用于一个输出缓冲区时,它会使该缓冲区“倒空”自身,而不管它是否已被填满。因此,为了解决屏幕缓冲问题,在需要“倒空”输出缓冲区时,你只需插入如下命令:
fflush(stdout):
在程序要求用户输入之前,或者在程序开始一项耗时的大型的计算工作之前,最好先“倒空”输出缓冲区。这样,当程序暂时停住时,你就能清楚地知道其原因了。
这种过程会给不了解其作用的程序员带来两个问题。首先,在程序送出输出内容后,它可能要再过一段时间后才会在屏幕上显示出来。如果程序员正在试图跟踪程序的当前运行状态,他就会被这种效果所困扰。
其次,更可怕的是,在程序显示提示信息并等待用户输入时,很可能就会发生问题。当程序试图从用户那里得到输入信息时,输出缓冲区可能还未被“填满”,因此送往屏幕的提示信息可能不会显示出来,用户也就不知道程序已经在等待他进行输入了——他所能得出的结论只能是这个“可爱”的程序突然停止工作了。
如何解决这个问题呢?有两种办法。第一种办法是在程序的开始部分,在进行任何输出之前,加入下述语句:
setvbuf(stdout,NULL,_IONBF,O);
该语句的作用是实现程序到屏幕的无缓冲输出。当这条命令被执行后,每一个被送往屏幕的字符都会立即显示出来。
用这种办法解决这个问题确实比较方便,但是还不够理想。笔者不想在这里对屏幕输入和输出展开一次技术讨论,但笔者要指出这样一点,即对屏幕输出进行缓冲是有充分的理由的,并且你还会希望这样做。
这佯一来,就引出了解决输出缓冲问题的另一种办法。当fflush()命令作用于一个输出缓冲区时,它会使该缓冲区“倒空”自身,而不管它是否已被填满。因此,为了解决屏幕缓冲问题,在需要“倒空”输出缓冲区时,你只需插入如下命令:
fflush(stdout):
在程序要求用户输入之前,或者在程序开始一项耗时的大型的计算工作之前,最好先“倒空”输出缓冲区。这样,当程序暂时停住时,你就能清楚地知道其原因了。