c++ - 告诉 `endl` 不要刷新

标签 c++ newline iostream

我的程序将大量短行打印到 cout

作为一个稍微做作的例子,我的台词看起来有点像这样:

cout<<"The variable's value is: "<<variable<<endl;

我希望程序运行,我相信 endl 正在杀死我,因为它在 cout 上启动缓冲区刷新每次使用它。

现在,网上有些人说我可以这样做:

cout<<"The variable's value is: "<<variable<<"\n";

但这似乎不是一个好的解决方案,因为 endl 抽象了可能指定结束行的特定系统特定方式,而 \n 则没有。这似乎也是一个糟糕的解决方案,因为如果我将来需要缓冲,我将不得不修改整个代码库。

因此,我问,有没有办法禁用 endl 的缓冲区刷新方面?

编辑

进一步挖掘似乎表明endl\n 都尊重操作系统可能选择结束其行的各种方式。 It also seems输出流检测它是否处于潜在的交互情况并相应地缓冲和刷新。因此:这个问题可以通过手动告诉输出流执行主动缓冲来解决......如果我能弄清楚该怎么做的话。

最佳答案

endl abstracts the particular system-specific ways an end line might be specified, where as \n does not".

std::endl 被定义为输出 '\n' 后跟刷新。系统特定换行符的正确抽象只是'\n'

为了防止刷新,我们只是不使用 std::endl。此外,如果标准输出连接到或可能连接到交互式设备,则标准输出可能是行缓冲的,在这种情况下,换行符将刷新流。如果这是一个问题,请使用连接到命名文件的 ofstream。我认为在类 Unix 系统上,只有当标准输出是终端时才会发生行缓冲。

关于c++ - 告诉 `endl` 不要刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21129162/

相关文章:

c++ - 正则表达式通过正则表达式测试器但在 qt 中失败

渲染新行的 HTML 规范?

vim - 为什么我需要二进制模式下的 vim 才能使 'noeol' 工作?

C++ While 循环不重新分配字符串值

c++ - C++ istream 中的行号?

C++ Boost::asio::io_service 如何在程序完成时安全销毁 io_service 资源

c++ - 将 std::string 散列为 std::size_t 以外的东西

c++ - std::optional 的运算符重载不明确?

python - Python 中的 CSV 在 Windows 上添加额外的回车符

c++ - 为什么 `operator<<` 的 `basic_ostream` 的右值重载会返回左值引用?