Windows命令行重定向下的c ++换行符

use*_*561 3 c++ windows redirect command-line newline

我发现Windows命令行重定向会自动将'\n'替换为'\ r \n'.有没有办法避免这种情况?因为在stdout或stderr重定向之后,如果你向控制台写'\ r \n',你将得到'\ r \n \n \n'而不是'\ r \n'.

非常感谢!

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

fprintf(stdout,"Hello, world!\r\n");
Run Code Online (Sandbox Code Playgroud)

然后你用重定向运行它:

demo 1>demo.log
Run Code Online (Sandbox Code Playgroud)

通过使用任何HEX编辑器,您会发现'\ r \n'由'\ r \n \n \n'表示.

更新:

@ steve-jessop我已经通过使用来解决这个问题setmode,这会强制stdout使用O_BINARY模式.所以流不会转化\n\r\n.

非常感谢!

Ste*_*sop 6

避免它的方法是不写"Hello, world!\r\n".任何一种fprintf(stdout,"Hello, world!\n");std::cout << "Hello, world!" << std::endl;足够的.

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


Mar*_*een 5

'\ n'是平台无关的换行符。它由编译器扩展为要编译的平台的实际换行符表示形式-Windows为'\ r \ n',* nix和朋友为'\ n',包括MacOS。

因此,这就是为什么您在十六进制编辑器中看到“ \ r \ r \ n”的原因-您在源代码中编写的“ \ r \ n”的“ \ n”已扩展为“ \ r \ r \ n”。

  • 它不会由编译器扩展,而是在编写时由流扩展。`strlen(“ \ n”)`始终为1。 (6认同)