为什么 sleep() 阻塞 std::ostream

Why does sleep() block std::ostream

鉴于以下情况:

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

字符串只会在五秒后写入cout。预期的行为是将消息打印到 cout,然后等待几秒钟。

为什么会这样?

std::cout 默认情况下是缓冲的,因此不会立即打印消息,只有当 std::cout 的缓冲区被刷新时,即程序终止时才会打印。

使用

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

正如@RemyLebeau 在此答案的评论中所述,<< std::endl 等同于 << '\n' << std::flush; 并刷新缓冲区。


此外,您缺少尾随的空字节,因此您的程序目前仍未定义。

输出通常是缓冲的,所以直到缓冲区满或文件关闭时才会输出。您需要手动 flush 输出;例如:

std::cout << i << " " << std::flush;

如果你想插入一个换行符,你可以使用 std::endl,这两个插入换行符 刷新流:

std::cout << i << " " << std::endl;

cout 已缓冲,因此它保存了您正在打印的 in-between 内容,并在刷新时一次打印它们。

您可以将 << std::endl; 添加到打印 i 的行,或者手动刷新缓冲区。