为什么 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
的行,或者手动刷新缓冲区。
鉴于以下情况:
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
的行,或者手动刷新缓冲区。