【问题标题】:c++ newline character under windows command line redirectionc++ windows命令行重定向下的换行符
【发布时间】:2011-10-17 00:03:13
【问题描述】:

我发现 Windows 命令行重定向会自动将 '\n' 替换为 '\r\n'。有什么方法可以避免这种情况吗?因为在 stdout 或 stderr 重定向之后,如果您将 '\r\n' 写入控制台,您将得到 '\r\r\n' 而不是 '\r\n'。

非常感谢!

你可以尝试一个简单的程序:

fprintf(stdout,"Hello, world!\r\n");

然后你用重定向运行它:

demo 1>demo.log

使用任何 HEX 编辑器,你会发现 '\r\n' 由 '\r\r\n' 表示。

更新:

@steve-jessop 我已经通过使用setmode 解决了这个问题,这将强制stdout 使用O_BINARY 模式。所以流不会将\n 翻译成\r\n

非常感谢!

【问题讨论】:

    标签: c++ windows command-line newline redirect


    【解决方案1】:

    '\n' 是与平台无关的换行符表示。它被编译器扩展为你正在编译的平台的任何实际换行符表示 - '\r\n' 用于 Windows,'\n' 用于 *nix 和朋友,包括 MacOS。

    这就是为什么你在十六进制编辑器中看到'\r\r\n'的原因——你在源代码中写的'\r\n'中的'\n'被扩展为'\r\r\n'。

    【讨论】:

    • 不是编译器扩展的,写的时候是流扩展的。 strlen("\n") 始终为 1。
    • @Steve 感谢您的更正!我不知何故让我意识到这是编译时的事情,而不是运行时的事情。一个快速的实验后我发现我错了。
    • 你的意思是 MacOS X。它是经典 MacOS 的 '\r'。
    【解决方案2】:

    避免它的方法是不要写"Hello, world!\r\n"fprintf(stdout,"Hello, world!\n");std::cout << "Hello, world!" << std::endl; 就足够了。

    这并不特定于命令行重定向或stdout,对于以字符模式(与二进制模式相反)打开的任何文件描述符也是如此。

    【讨论】:

      猜你喜欢
      • 2014-07-21
      • 2012-07-07
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2013-04-06
      • 2012-02-22
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多