我发现Windows命令行重定向会自动将'\ n'替换为'\ r \ n'。有没有办法避免这种情况?因为在stdout或stderr重定向之后,如果你向控制台写'\ r \ n',你将得到'\ r \ n \ n \ n'而不是'\ r \ n'。
非常感谢!
你可以尝试一个简单的程序:
fprintf(stdout,"Hello, world!\r\n");
然后用重定向运行它:
demo 1>demo.log
通过使用任何HEX编辑器,您会发现'\ r \ n'由'\ r \ n \ n \ n'表示。
更新:
@ steve-jessop我使用setmode
解决了这个问题,这会强制stdout
使用O_BINARY
模式。因此,流不会将\n
转换为\r\n
。
非常感谢!
答案 0 :(得分:6)
避免它的方法是不写"Hello, world!\r\n"
。 <{1}}或fprintf(stdout,"Hello, world!\n");
就足够了。
这不是特定于命令行重定向或std::cout << "Hello, world!" << std::endl;
,对于在字符模式下打开的任何文件描述符(与二进制模式相反)也是如此。
答案 1 :(得分:5)
'\ n'是与平台无关的换行符表示。它由编译器扩展为您正在编译的平台的实际换行表示 - 对于Windows为'\ r \ n',对于* nix和朋友包括MacOS为'\ n'。
所以这就是你在十六进制编辑器中看到'\ r \ n \ n \ n'的原因 - 你在源代码中写的“\ n \ n”中的'\ n'被扩展为'\ r \ n \ n \ n'。