std :: endl和\ n之间的区别(关于平台意识)

时间:2012-03-14 09:38:38

标签: c++ platform endl

在您将此问题声明为thisthat的副本之前,请考虑我已\nstd::endl提交了问题并获得了WA,并且然后用\n获得AC。所以,我需要一个非常具体的答案来解决平台感知:{{1}}是否真的可以识别平台,并且运行时是否真的根据平台写出正确的行结尾作为答案其他问题声称?如果是的话,你能告诉我这是怎么发生的吗?

如果答案可以通过关于平台意识问题的标准的引用来支持,我会非常感激。我已经阅读了所有其他问题的答案(即使是封闭的答案),所以请不要重复“冲洗缓冲区”的事情。

2 个答案:

答案 0 :(得分:5)

来自C++11§27.7.3.8 -

namespace std
{
    template <class charT, class traits>
        basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}
  

效果:调用os.put(os.widen('\ n')),然后调用os.flush()。

     

返回:OS

因此,从标准来看,endl清除输出流缓冲区是明确的,而\n则不会。通常,您需要使用endl来打印新行,但是您还应该记住,每次执行此操作时,输出缓冲区也会被刷新。

关于平台意识

从标准来看,显然两者完全相同 - 以完全相同的方式打印新行。因此,如果一个是独立于平台的,那么另一个也应该是相同的。由于我确信endl与平台无关,因此\n也应如此。

答案 1 :(得分:5)

std::endl是一个输出'\n'的操纵器,然后刷新流。对于大多数临时使用,这是你应该使用的。但是,在输出大量数据时,可能会导致严重的性能损失,在这种情况下,请使用'\n'

编辑:

关于平台意识:两者输出完全相同的东西。如果在文本模式下打开流,'\n'将导致行结束的平台相关表示:Unix下的0x0A,Windows下的0x0D,0x0A,在某些大型机下启动新记录等。如果流以二进制模式打开,它将导致输出单个字节(通常为0x0A,但实际上取决于所使用的基本字符编码)。