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

时间:2011-07-31 17:58:36

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

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

非常感谢!

2 个答案:

答案 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'。