在 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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是tick每秒出现一个的输出:
tick
tick
tick
tick
tick
Run Code Online (Sandbox Code Playgroud)
但是,当删除第\n15 行中的它时,它似乎只是卡在某处而没有任何反应。\n代码到底做了什么?如果我不想在每个循环后都打印新行,我该怎么办?(我认为将其称为 C++ 中的错误会有点傲慢和错误)
另外,我知道这可能是构建延迟功能的一种非常糟糕的方式,我只是在胡闹。
Som*_*ude 10
似乎您std::cout对 C 输出流的写入实现stdout。并且stdout默认情况下(当连接到终端时)line-buffered。
行缓冲意味着输出在内部进行缓冲,直到将换行符 ( '\n') 添加到缓冲区。然后缓冲区被刷新并实际写入终端。
您可以使用 C++ I/O 操纵器显式刷新缓冲区std::flush,如
cout << "tick" << std::flush;
Run Code Online (Sandbox Code Playgroud)
这将立即刷新缓冲区并将其写入终端。但是没有换行符。要添加换行符,您可以使用std::endl:
cout << "tick" << std::endl; // Add newline and flush
Run Code Online (Sandbox Code Playgroud)
但请注意,此处不需要显式额外刷新,因为换行符本身会刷新缓冲区。std::endl因此,由于换行符,Using将首先刷新缓冲区一次,然后由于显式刷新语义而刷新空缓冲区。
建议您不要使用std::flush(或std::endl),除非您真的必须这样做。在大多数情况下,它并不是真正需要的。
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |