当程序向输出设备中输出数据时,输出的数据先被存放在计算机缓冲区(Buffer)内。当缓冲区存满时,这些数据才真正地输出到输出设备。但是,如果输出的字符序列中出现了endl控制符,那么缓冲区内的所有数据将立即输出到输出设备,而无论缓冲区是否已经存满。因此,endl控制符的作用是将光标移动到输出设备中下一行开头处,并且清空缓冲区。
很有可能出现在程序终止时,并没有输出所有的输出数据的情况。这是因为在程序终止时,缓冲区并不一定是满的,所以也就没有将缓冲区中的数据写到输出设备。
在C++中,可以使用flush函数来清空缓冲区,即使缓冲区中的数据不是满的。与endl控制符不同的是,flush函数并不是把光标移到下一行的开头处。
使用flush函数的语法是:
ostreamVar.flush();
这里ostreamVar是输出流变量,例如cout。
与endl一样,flush可以作为控制符使用。在这种情况下,flush使用在输出语句中,并不加括号。例如,下面的语句将数据从缓冲区写到标准输出设备:
cout<<flush;
例:考虑下面的语句,其中num是int类型变量:
cout<<”enter an integer:”;
cin>>num;
cout<<endl;
注:cout<<endl;等同于cout<<'\n'<<flush;
第一行语句输出文字:“enter an integer:”。在输出这一行文字后,光标停留在冒号后面的位置上。注意,第1行语句的输出首先被送到缓冲区中。如果缓冲区中的数据没有存满,那么这行提示文字就不会显示出来(现在的编译器可能对输出进行了优化,所以在某些编译器中可以看到该语句)。这时用户也就不知道下一步应该做什么。可以在第1行语句后面使用endl控制符。但是如果这样做,在输出这行文字后,光标将被移到下一行的开头处,用户也就必须在下一行中输入数字。而这样做并不是最恰当的。还可以使用下面的语句替换掉1行语句:
cout<<”enter an integer:”<<flush;
在这种情况下,文字行“enter an integer:”,即使在缓冲区数据没有存满时也会立即被输出到标准输出设备上。而且,在输出这行文本后,光标将停留在分号的下一个位置上。用户将在分号后面输入数字。