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

Oma*_*man 2 c++ platform endl

在你宣布这个问题进行重复这个那个,请考虑,我已经提交了一个问题,在线法官\n,得到了WA,然后用std::endl,得到了交流.所以,我需要一个非常具体的答案来解决平台意识:\n真的是平台意识,并且运行时是否真的根据平台写出正确的行结尾,因为其他问题的答案主张?如果是这样,你能告诉我这是怎么发生的吗?

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

MD *_*med 5

来自C++11,§27.7.3.8-

namespace std
{
    template <class charT, class traits>
        basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}
Run Code Online (Sandbox Code Playgroud)

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

返回:操作系统.

因此,从标准中可以清楚地endl刷新输出流缓冲区,而\n不是.通常,您将需要endl用于打印新行,但您还应记住,每次执行此操作时,输出缓冲区也将被刷新.

关于平台意识

从标准来看,显然两者完全相同 - 以完全相同的方式打印新行.因此,如果一个是独立于平台的,那么另一个也应该是相同的.由于我肯定知道endl平台是独立的,所以应该是这样的\n.


Jam*_*nze 5

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

编辑:

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