问题描述
- C++中的cout的缓存区清空问题
-
很多地方都看到这样一个描述“cout有一个缓存区,当用cout向输出流中插入待输出内容时,这些待输出内容并不是立即就被送到输出设备了,而是先存入到这个缓存区中,当cout遇到endl或者缓存区满的时候才会向屏幕输出”请问这句话是对的吗?我怎么总感觉不对劲啊,感觉有矛盾啊,如果这个说法是正确的,那么是不是说当执行输出语句cout<<a时如果缓存区没有满或者没有遇到endl的时候就不能进行输出了吗?是这样理解吗?求解啊!!!
解决方案
因为cout是行缓冲的,只有在以下情况下,cout才会立即输出:
(1)缓冲区满
(2)用户手动刷新,显式地清空缓冲
(3)程序结束
(4)从标准输入流中读数据
与cout不同,printf是无缓存的,立即输出。你可以把cout换成printf,就能看出区别了。
解决方案二:
在Unix下的C语言用select函数就可以判断有无数据。
Windows下网络也可用select,键盘输入则用_kbhit函数。
MSDN里的例子:
#include
#include
int main( void )
{
/* Display message until key is pressed. */
while( !_kbhit() )
_cputs( "Hit me!! " );
/* Use _getch to throw key away. */
printf( "nKey struck was '%c'n", _getch() );
}
也可以参考http://bbs.csdn.net/topics/390497761
时间: 2024-12-11 17:37:13