gpt4 book ai didi

c++ - 换行和回车

转载 作者:可可西里 更新时间:2023-11-01 17:37:25 27 4
gpt4 key购买 nike

最近我在处理一些字符串、文本输入等类似的东西,我意识到我对 2 个字符——LF(10) 和 CR(13) 有点困惑。每次我需要开始新行时,我都使用 std::endl 表示 C++ 字符串,而\n 是表示 C 字符串的 LF。但是,我现在使用的是一个库,该库在返回键时向我发送的不是 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,如果需要,操作系统是否会自动将 LF 解释为新行并返回到行首,或者 CR 必须仍硬编码在我发送以供打印的数据中?

最佳答案

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

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

*仅使用 LF(即 \n)的 NIX 系统实际上不进行任何转换,但出于可移植性/清晰性目的正确指定二进制/文本模式仍然很好。

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

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


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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com