我发现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'。