09-刷新输出缓冲区
17.2.3 刷新输出缓冲区
如果程序使用cout将字节发送给标准输出,情况将如何?由于ostream类对cout对象处理的输出进行缓冲,所以输出不会立即发送到目标地址,而是被存储在缓冲区中,直到缓冲区填满。然后,程序将刷新(flush)缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据。通常,缓冲区为512字节或其整数倍。当标准输出连接的是硬盘上的文件时,缓冲可以节省大量的时间。毕竟,不希望程序为发送512个字节,而存取磁盘512次。将512个字节收集到缓冲区中,然后一次性将它们写入硬盘的效率要高得多。
然而,对于屏幕输出来说,首先填充缓冲区的重要性要低得多。如果必须重述消息“Press any key to continue”以便使用512个字节来填充缓冲区,实在是太不方便了。所幸的是,在屏幕输出时,程序不必等到缓冲区被填满。例如,将换行符发送到缓冲区后,将刷新缓冲区。另外,正如前面指出的,多数C++实现都会在输入即将发生时刷新缓冲区。也就是说,假设有下面的代码:
cout << "Enter a number: ";
float num;
cin >> num;
程序期待输入这一事实,将导致它立刻显示cout消息(即刷新“Enter a number:”消息),即使输出字符串中没有换行符。如果没有这种特性,程序将等待输入,而无法通过cout消息来提示用户。
如果实现不能在所希望时刷新输出,可以使用两个控制符中的一个来强行进行刷新。控制符flush刷新缓冲区,而控制符endl刷新缓冲区,并插入一个换行符。这两个控制符的使用方式与变量名相同:
cout << "Hello, good-looking! " << flush;
cout << "Wait just a moment, please." << endl;
事实上,控制符也是函数。例如,可以直接调用flush()来刷新cout缓冲区:
flush(cout);
然而,ostream类对<<插入运算符进行了重载,使得下述表达式将被替换为函数调用flush(cout):
cout << flush
因此,可以用更为方便的插入表示法来成功地进行刷新。