最近,我正在使用一些字符串,文本输入之类的东西,我意识到我对2个字符感到有点困惑-LF(10)和CR(13)。每次我需要开始换行时,我都会使用std::endl来表示c++字符串,并使用\n来表示c字符串。但是,我现在使用的是一个库,在按回车键时,它发送给我的不是LF而是CR的键代码。我在维基百科上读到用法如下:

CR+LF: Microsoft Windows, DEC TOPS-10, RT-11 and most other early non-Unix and non-IBM OSes, CP/M, MP/M, DOS (MS-DOS, PC-DOS, etc.), Atari TOS, OS/2, Symbian OS, Palm OS
LF+CR: Acorn BBC spooled text output.
CR:    Commodore 8-bit machines, Acorn BBC, TRS-80, Apple II family, Mac OS up to version 9 and OS-9
LF:    Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others.
RS:    QNX pre-POSIX implementation.

但是我从来没有真正注意到Windows上需要CR,无论如何都在正确的位置打印了所有内容。再次根据维基百科,CR在类型作家的时代曾被用于使该写头返回到行首,然后被LF滚动到以下一行。

我的问题是,如今是否真的有必要使用CR,为什么?如果仅使用LF,哪些系统可能无法正确输出文本?打印机是否仍然需要CR,如果是,OS是否会自动将LF解释为新行并返回到行首,还是CR必须仍硬编码在我发送用于打印的数据中?

最佳答案

在C和C++程序中,您所需要的(至少是在处理标准库时)是\n,将其发送到以文本模式打开的任何C/C++流时(即,当您不在b中指定fopen时)和C++流的ios::bin),会自动转换为当前平台的行终止符。因此,在Windows上,您可以只将\n写入任何流,并且在控制台上将它“神奇地”变成CRLF到文件中。

为此,存在整个二进制/文本模式的东西:在编写文本文件时,进行这种翻译很有用(通过这种方式,您可以在字符串中使用\n作为行终止符,而不必担心特定的平台行终止符),但是当您编写二进制文件时,\n就像其他字节一样,不应进行翻译,否则会损坏数据。

*仅使用LF的NIX系统(即\n)实际上不执行任何翻译,但是出于可移植性/清晰度的目的,正确指定二进制/文本模式仍然是不错的选择。

在C++中始终使用endl是一个常见错误,\n足以将翻译转换为特定于平台的行终止符。
endl\n做的更多的工作是刷新流缓冲区,这在某些有限的情况下很有用(例如,在长时间操作之前在控制台上输出某些内容),但通常会减慢IO的速度(在控制台上通常不明显,但在文件上是)。我通常只使用\n并在实际需要冲洗时添加std::flush

这与标准库有关;在处理其他库YMMV时,您应该查看其文档以查看它们是否遵循标准C约定,或者它们是否需要包含平台特定的行终止符的字符串。

关于c++ - 换行和回车,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7372012/

10-13 06:00