【问题标题】:Why additional \r is injected in windows?为什么在windows中注入额外的\r?
【发布时间】:2011-05-26 05:52:25
【问题描述】:
#include <iostream>
using namespace std;
int main( int argc, char *argv[])
{
    cout << "Hello\nWorld";
}

D:\test>hw |od -c
0000000   H   e   l   l   o  \r  \n   W   o   r   l   d
0000014

为什么在 windows 中注入额外的\r(在 linux 上不会发生)?

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

    这是 Windows 的一项功能,可以追溯到 MS-DOS 的最初几天。在这些系统中,约定是行分隔符是字符对“\r\n”。当然,在Linux/Unix/Solaris/等中,行分隔符是单个字符“\n

    有各种实用程序,例如 Linux 的 dos2unixunix2dos,它们除了这种转换之外什么都不做。几乎每个文件传输程序也都有处理它的方法。参见kermit的模式命令。

    该约定影响了 MSDOS/windows C 运行时库函数 fopen()(以及其他):第二个参数可以具有 bt 以显式设置行分隔符转换。 text 转换在输入上将\r\n 转换为\n,在输出上将\n 转换为\r\nbinary 转换没有这种转换。

    FILE *f1 = fopen ("somefile.txt", "rt");  /* open in text conversion mode */
    FILE *f2 = fopen ("anotherfile.bin", "rb");  /* open without text conversion */
    

    【讨论】:

    • @wallyk,cout 不应该完全按照我说的输出吗?
    • 我很确定 MS C++ 编译器应该有一个编译器选项,指示它如何处理 "\n" - 作为 LF 字符或作为 CR+LF 的行尾序列
    • @DriverBoy:它正在按你说的做:你要求一个行分隔符,这就是你得到的。
    • @DriverBoy @Davka - 这符合 C++ 的方式!在文本模式下打印'\n' 要求换行。有些系统只存储“\n”,有些系统存储一个“\r\n”或只存储一个“\r”。还有一些记录行长,只存储其他字符。在 C 和 C++ 中,打印 '\n' 适用于所有这些系统。这是标准!
    • @davka:这是合规行为。您已经可以选择在程序中关闭转换,因此编译器标志是完全没有必要的。
    【解决方案2】:

    因为输出函数是平台相关的。在 windows 中,所有换行符都是 \r\n,int constract,linux/unix 是 \n

    【讨论】:

    • 这似乎是c/c++中输出函数的一个bug,windows上的其他编程语言不会发生这种情况。
    • @DriverBoy,C/C++ 实际上在这里以正确的颜色显示世界。许多其他语言都忽略了程序员的这个问题。
    • Windows 上的换行符是 \r\n。如果您的语言不适合您,那么您必须手动完成。尝试在没有 \r 的情况下填充 Win32 文本区域,您会发现它全部在一行中,其中 \n 应该是方形框。这根本不是错误。
    • @DriverBoy,这不是错误,而是依赖于平台的实现。 c/c++ 对您的输出和输入几乎没有什么作用,而其他语言则很多,例如 python 或 java。
    【解决方案3】:

    Windows、Unix 和 Mac 都以不同的方式标记换行符。

    Windows 使用 \r\n、Unix/Linux \n、Mac \r。一旦你开始在多个平台上处理文本文件,这就会变得一团糟。这就是为什么任何严肃的文本编辑器都可以选择在它们之间切换以及为什么 Linux 具有像 dos2unix 这样的实用程序的原因。尝试将 Unix 风格的文本文件(只有 \n)加载到记事本中。您会注意到所有内容都在一条线上。

    【讨论】:

    • @Adam,顺便说一句,我知道\n 表示新行,它开始一个新行,那么\r,它到底是做什么的?
    • 这一切都可以追溯到您拥有只是普通打字机的点阵打印机的那一天。 \n 表示换行(LF),即移动到下一行。 \r 表示回车(CR),将头部移动到行首。 Windows 来自的血统让他们先将头部向后移动,然后转到下一行。 Unix 假设换行也意味着回车。
    • 在 Unix 上,您可以使用 \r 在同一行重新开始。您可以通过这种方式制作廉价的进度计数器。 IE。有一些东西就地计算。
    • @Adam,by Try loading a Unix-style text file (with only \n) into Notepad. You'll notice it's all on one line.,所以你的意思是没有\r的单个\n在Windows中没有任何意义,对吧?
    • 记事本只是一个 Win32 文本区域和一个菜单。这就是它易受此影响的原因。任何自尊的文本编辑器都会处理它。我对 Vista 或更新的记事本没有什么经验,所以他们可能最终解决了这个问题。
    猜你喜欢
    • 2014-03-26
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多