std :: endl在每个平台上的确切代表是什么?

时间:2009-12-15 22:50:51

标签: c++

考虑UNIX,Windows和Mac以及输出流(二进制和文本),

std::endl代表什么,即<CR><LF><LF><CR>?或者无论平台/编译器是什么,它总是一样的吗?

我问的原因是我正在编写一个TCP客户端,该客户端会讨论一个协议,该协议要求每个命令以<CR><LF>结尾。所以我想知道是否在我的流中使用std::endl"\r\n"

编辑:好的,所以一个人刷新缓冲区而另一个没有。我明白了。但是,如果我正在向文件输出文本,'\n'<LF>还是在Windows上转换为<CR><LF>而在Unix上转换为<LF>?我还没有看到明确的答案。

5 个答案:

答案 0 :(得分:11)

代码:

stream << std::endl;

// Is equivalent to:

stream << "\n" << std::flush;

所以问题是什么是“\ n”映射。
在正常的流上没有任何事情但是对于文件流(在文本模式下),“\ n”被映射到行序列的平台末尾。注意:当读取文本模式下的文件时,读取会将行序列的平台末端转换回'\ n'。

因此,如果您使用普通流,则不会发生任何事情。如果您正在使用文件流,只需确保以二进制模式打开它,以便不应用任何转换:

stream << "\r\n"; // <CR><LF>

答案 1 :(得分:7)

C ++标准说:

  

然后调用os.put(os.widen('\ n'))   os.flush()

转换为'\ n'的内容,如果完全转换,则归结为它所使用的流类型,以及可以打开流的任何可能模式。

答案 2 :(得分:4)

使用stream << "\r\n"(并以二进制模式打开流)。 stream << std::endl;相当于stream << "\n" << flush;。如果代码在Windows上运行,“\ n”可能会转换为“\ r \ n”,但您不能指望它 - 至少有一个Windows编译器将其转换为“\ n \ r”。在Mac上,它很可能被转换为“\ r \ n”,而在Unix / Linux和大多数类似的系统上,它只会被保留为“\ n”。

答案 3 :(得分:2)

引用related question上接受的答案:

  

变化的行尾字符无关紧要,假设文件在文本模式下打开,除非你要求二进制文件,否则这就是你得到的。编译后的程序将为编译的系统写出正确的内容。

     

唯一的区别是std :: endl刷新输出缓冲区,'\ n'不刷新输出缓冲区。如果您不想频繁刷新缓冲区,请使用'\ n'。如果你这样做(例如,如果你想获得所有输出,并且程序不稳定),请使用std :: endl

在您的情况下,由于您特别需要<CR><LF>,因此您应该明确使用\r\n,然后如果您仍想刷新输出缓冲区,请调用std::flush()

答案 4 :(得分:0)

看起来你的问题已被提出。每个命令都以[]结尾?对于线上协议,我建议使用不随平台变化的分隔符。 std :: endl可以解析为'\ r \ n'或'\ n \ r',具体取决于平台。