c++ - C++:为什么这段代码只在使用'\n'时才有效?
问题描述
在 Ubuntu 18.04 上使用 g++ 编译时,以下 C++ 代码可以正常工作:
#include <iostream>
using namespace std;
void wait(){
int t0 = time(0);
while(true){
if(time(0) >= t0 + 1){
return;
}
}
}
int main(){
while(true){
cout << "tick\n"; //Line 15
wait();
}
}
这是tick
每秒出现一个的输出:
tick
tick
tick
tick
tick
然而,当删除第\n
15 行时,它似乎只是卡在某个地方,没有任何反应。究竟\n
对代码做了什么?如果我不想在每个循环后换行打印怎么办?(我认为将其称为 C++ 中的错误会有点傲慢和错误)
另外,我知道这可能是构建延迟功能的一种非常糟糕的方式,我只是在搞砸一点。
解决方案
似乎您std::cout
对 C 输出流的写入实现stdout
。并且stdout
默认情况下(当连接到终端时)line-buffered。
行缓冲意味着输出在内部被缓冲,直到将换行符 ( '\n'
) 添加到缓冲区。然后缓冲区被刷新并实际写入终端。
您可以使用 C++ I/O manipulator 显式刷新缓冲区std::flush
,如
cout << "tick" << std::flush;
这将立即刷新缓冲区并将其写入终端。但没有换行符。要添加换行符,您可以使用std::endl
:
cout << "tick" << std::endl; // Add newline and flush
但请注意,这里不需要显式的额外刷新,因为换行符本身会刷新缓冲区。因此,由于换行符,使用std::endl
将首先刷新缓冲区一次,然后因为显式刷新语义而刷新空缓冲区。
建议您不要使用std::flush
(或std::endl
),除非您确实必须这样做。在大多数情况下,它并不是真正需要的。
推荐阅读
- angular - Angular 指令选择器不适用于外部库中的元素
- javascript - 如何检查电子邮件是否有效
- unit-testing - 通过模拟 getter 测试类
- github - 为什么我需要根据许可证提交补丁?
- javascript - 如何通过单击链接或 url 根据请求参数中的值更改页面内容?
- azure-functions - 如何配置 Azure Functions 以连接到 NSG 后面的 VM
- python-3.x - 如何从与字符串的另一端匹配的字符串末尾删除/删除字符
- java - Android - 使用 WeakReference 将数据保存在内存中
- python - 使用 pandas 将顺序数据文件重新格式化为数据框
- python - 如何在数据框中删除多列,同时使用 loc 和列名