最近我正在处理一些字符串,文本输入,诸如此类的事情,我意识到我对两个字符- 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必须仍然硬编码在我发送打印的数据中?
发布于 2011-09-10 21:38:54
在你的C和C++程序中,你所需要的(至少在处理标准库时)是\n,当它被发送到任何以文本模式打开的C/C++流时(例如,当你没有为C++流指定fopen和ios::bin时),它会自动转换为当前平台的行终止符。这就是为什么在Windows上,你只需将\n写到任何流中,它就会“神奇地”变成控制台上的文件。
整个二进制/文本模式的存在就是为了这个目的:当你编写一个文本文件时,进行这种翻译是很有用的(这种方式在你的字符串中,你可以只使用\n作为行终止符,而不用担心特定的平台行终止符),但是当你写一个二进制文件时,\n和其他的一样只是一个字节,不应该被翻译,否则你会得到损坏的数据。
*仅使用LF (即\n)的NIX系统实际上不会进行任何转换,但为了便于移植/清晰起见,最好还是正确地指定二进制/文本模式。
在C++中使用always endl是一个常见的错误,\n足以将翻译转换到特定于平台的行终止符。
与\n相比,endl做的更多的是刷新流缓冲区,这在一些有限的情况下可能很有用(例如,在长时间操作之前在控制台上输出某些内容),但通常只会减慢IO (在控制台上通常不明显,但在文件上却很明显)。我通常只使用\n并在实际需要刷新时添加一个std::flush。
这与标准库有关;当处理其他库时,YMMV和您应该查看它们的文档,看看它们是否遵循标准C约定,或者它们要求字符串包含特定于平台的行终止符。
https://stackoverflow.com/questions/7372012
复制相似问题