考虑UNIX,Windows和Mac以及输出流(二进制和文本),
std::endl
代表什么,即<CR><LF>
,<LF>
或<CR>
?或者无论平台/编译器是什么,它总是一样的吗?
我问的原因是我正在编写一个TCP客户端,该客户端会讨论一个协议,该协议要求每个命令以<CR><LF>
结尾。所以我想知道是否在我的流中使用std::endl
或"\r\n"
。
编辑:好的,所以一个人刷新缓冲区而另一个没有。我明白了。但是,如果我正在向文件输出文本,'\n'
是<LF>
还是在Windows上转换为<CR><LF>
而在Unix上转换为<LF>
?我还没有看到明确的答案。
答案 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',具体取决于平台。