2015-12-31 43 views
0

考虑以下几点:为什么睡眠()块的std :: ostream的

const char opn[8] = { 0x16, 'O', 'P', 'N', 0x17, 0xa8, 0xa9, '\0' }; 
std::cout << opn; 
sleep(5); 

串只会五秒后写入cout。预期的行为是打印邮件到cout,然后等待几秒钟。

为什么会发生这种情况?

+5

我预测结果会改变,如果你在睡觉前写'cout.flush()' –

+0

首先,你的\ 0在哪里?其次,线路缓冲可能是一个因素,但首先摆脱UB。 – deviantfan

回答

4

std::cout默认被缓存,因此消息不会立即打印,而只会在std::cout的缓冲区被刷新时(即程序终止时)。

使用

std::cout << opn << std::flush; 

由于@RemyLebeau在评论这个回答说:<< std::endl相当于<< '\n' << std::flush;,并刷新缓冲区。


此外,你缺少尾随空字节,所以你的程序仍然是不确定的。

+0

'std :: cout << opn << std :: endl'也会刷新缓冲区(输出换行符后)。 –

+0

@RemyLebeau好的,但这对OP有何帮助?如果他想要一个尾随的换行符,他会说我想。 – Downvoter

+2

只需说明关于冲洗的额外事实。并不是每个人都明白std :: endl会执行flush,很多人认为它只是''n''的别名,并且可以互换使用。 –

相关问题