首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >换行符和回车符

换行符和回车符
EN

Stack Overflow用户
提问于 2011-09-10 21:29:47
回答 1查看 29.2K关注 0票数 8

最近我正在处理一些字符串,文本输入,诸如此类的事情,我意识到我对两个字符- LF(10)和CR(13) -有点困惑。每次需要开始新行时,我使用std::endl表示c++字符串,使用\n表示c字符串。然而,我现在使用的是一个库,它在按回车键时发送给我的不是LF,而是CR键代码。我在维基百科上看到它的用法如下:

代码语言:javascript
复制
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必须仍然硬编码在我发送打印的数据中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-10 21:38:54

在你的C和C++程序中,你所需要的(至少在处理标准库时)是\n,当它被发送到任何以文本模式打开的C/C++流时(例如,当你没有为C++流指定fopenios::bin时),它会自动转换为当前平台的行终止符。这就是为什么在Windows上,你只需将\n写到任何流中,它就会“神奇地”变成控制台上的文件。

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

*仅使用LF (即\n)的NIX系统实际上不会进行任何转换,但为了便于移植/清晰起见,最好还是正确地指定二进制/文本模式。

在C++中使用always endl是一个常见的错误,\n足以将翻译转换到特定于平台的行终止符。

\n相比,endl做的更多的是刷新流缓冲区,这在一些有限的情况下可能很有用(例如,在长时间操作之前在控制台上输出某些内容),但通常只会减慢IO (在控制台上通常不明显,但在文件上却很明显)。我通常只使用\n并在实际需要刷新时添加一个std::flush

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7372012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档