【问题标题】:What's the difference between std::endl and '\n'std::endl 和 '\n' 有什么区别
【发布时间】:2021-01-22 23:45:19
【问题描述】:

我读过std::endl'\n' 之间的区别在于std::endl 会刷新缓冲区而'\n' 不会。但是,据我所知,Linux 上的stdout 无论如何都是行缓冲的,那么这是否意味着std::cout << ... << std::endlstd::cout << ... << '\n' 相同?

【问题讨论】:

  • 但是,据我所知,linux 上的 stdout 无论如何都是行缓冲的 仅当stdout 正在写入设备时。如果它被重定向到一个文件,那么它是块缓冲的。
  • 并且可以使用setvbuf()轻松更改缓冲模式
  • “基本上”不用说。您没有提供差异摘要;这的区别。可以查看the documentation; cppreference 文档首先声明std::cout << std::endlstd::cout << '\n'; 相同,然后是std::cout.flush();

标签: c++ linux iostream endl


【解决方案1】:
std::ostream os;

os << std::endl; // more concise

os << '\n' << std::flush; // more explicit about flushing

这两行的效果完全一样。

手动冲洗往往是浪费时间:

  • 如果输出流是行缓冲的,std::cout 应该是这种情况,如果它连接到交互式终端并且实现可以检测到,然后打印 \n 已经刷新。

  • 如果输出流与您之后直接读取的输入流配对(std::coutstd::cin 配对),则读取已经刷新。

  • 如果您没有人等待数据到达其目的地,那么刷新再次只是浪费。

【讨论】:

    【解决方案2】:

    这个std::cout &lt;&lt; ... &lt;&lt; std::endl 和这个std::cout &lt;&lt; ... &lt;&lt; '\n' 并不完全相同。在最后一个中,换行符\n 被流式传输到输出。在大多数情况下,这将被控制台解释为换行符。但是std::endl 意味着(正如您已经提到的)在输出控制台中完全刷新和换行。

    假设您将其写在文档中。在 Linux 中,\n 就足够了。但 Windows 需要 \r\n。因此,使用\n 和例如不会出现新行。 Windows 中的记事本++。

    【讨论】:

    • os &lt;&lt; std::endl;os &lt;&lt; '\n' &lt;&lt; std::flush; 完全相同。它不会输出一些神奇的换行符,但也会输出\n。输出流是否处于文本模式,以及是否在将 \n 转换为 \r\n 的系统上是另一回事。
    • “但 Windows 需要 \r\n。” -- 我相信控制台默认使用文本模式,这意味着在Windows上,程序可以忽略Windows内部使用\r\n作为换行符的事实,这样程序就可以简单地使用\n。这会在适当的时候自动转换为\r\n(反之亦然)。
    • 所以如果我 1) 使用 linux; 2)打印到标准输出(无重定向); 3)没有改变缓冲模式,他们是平等的?
    • @Deduplicator 也许我以一种误导的方式表达了它。我的意图是声明std::cout &lt;&lt; ... &lt;&lt; std::endlstd::cout &lt;&lt; ... &lt;&lt; "\n" 不同。正如您已经提到的,没有神奇的换行符。我不确定它在 Windows 中是否总是\n\r\n。所以我想声明用户可以信任它,std::endl 将创建一个换行符并在操作系统的输出控制台中刷新输出 -tream。
    • '\n' 告诉 Steam 做任何必要的事情来生产一条新生产线。这隐藏了系统依赖关系:代码编译用于的操作系统上的约定无关紧要;流会正确处理。
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2015-04-19
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多