Windows命令行redirect下的c ++换行符

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

非常感谢!

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

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

那么你使用redirect来运行它:

 demo 1>demo.log 

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

更新:

@ steve-jessop我已经解决了这个问题,使用setmode ,这将强制使用O_BINARY模式的stdout 。 所以stream不会将\n转换成\r\n

非常感谢!

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

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

'\ n'是与平台无关的换行符表示。 它由编译器扩展为任何正在编译的平台的实际换行符表示形式,对于Windows为“\ r \ n”,对于* nix和包括MacOS在内的朋友则为“\ n”。

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