std::endl 和 ' 有什么区别 '

问题描述 投票:0回答:3

我读过

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

c++ linux iostream endl
3个回答
0
投票
std::ostream os;

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

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

这两行的效果完全相同。

手动冲洗常常浪费时间:

  • 如果输出流是行缓冲的,

    std::cout
    应该是这种情况,如果它连接到交互式终端并且实现可以检测到这一点,那么打印
    \n
    已经刷新。

  • 如果输出流与您随后直接读取的输入流配对(

    std::cout
    std::cin
    配对),则读取已经刷新。

  • 如果没有人等待数据到达目的地,那么刷新又会浪费。


0
投票

使用

std::endl
- 它准确地表达了你想要的内容:和结束线符号。 当您拥有更具表现力和更易于使用的方法时,没有理由坚持使用古老的字符代码。

它会打印不同的字符吗?不。

std::endl
扩展为
\n
,然后扩展为系统换行符号(正确的形式是
\r\n
- 即使原始数据中的 Unix 终端也会将
\n
转换为
\r\n
,导致
\n
实际上只意味着“向下 1 行”而不是“到达下一行的开头”。只有 Unix 衍生操作系统使用
\n
)

性能有差异吗?这取决于: 当使用 shell 时, no -

\n
会同样刷新(除非您专门更改流设置以不与 printf 同步输出)。 进行文件 IO 时:是 - 这里
\n
不会刷新。因此,如果您对未完成的写入感到满意,那么您可以使用
\n

但性能差异大多无关紧要。你在这里谈论的是文本输出......特别是当它用于用户界面时,这是完全可以忽略不计的,因为没有人会每秒读取数百行来刷新产生任何明显的影响。


-2
投票

这个

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

假设您将其写在文档中。在 Linux 中,

\n
就足够了。但 Windows 期望
\r\n
。因此,使用
\n
和 e.g. 不会出现新行。 Windows 中的 Notepad++。

© www.soinside.com 2019 - 2024. All rights reserved.