c++ Windows命令行重定向下的换行符
我发现 Windows 命令行重定向会自动将 '\n' 替换为 '\r\n'。有什么方法可以避免这种情况吗?因为在 stdout 或 stderr 重定向之后,如果将 '\r\n' 写入控制台,您将得到 '\r\r\n' 而不是 '\r\n'。
多谢!
你可以尝试一个简单的程序:
fprintf(stdout,"Hello, world!\r\n");
然后用重定向运行它:
demo 1>demo.log
通过使用任何十六进制编辑器,你会发现'\r\n'由'\r\r\n'表示。
更新:
@steve-jessop 我已经使用 setmode
解决了这个问题,这将强制 stdout
使用 O_BINARY
模式。因此流不会将 \n
转换为 \r\n
。
多谢!
I found that Windows command line redirection will replace '\n' with '\r\n' automatically. Is there any method to avoid this situation? Because after stdout or stderr redirection, you will got '\r\r\n' instead of '\r\n' if you write '\r\n' to the console.
Thanks a lot!
you can just try a simple program:
fprintf(stdout,"Hello, world!\r\n");
then you run it with redirection:
demo 1>demo.log
By using any HEX editor, you will find that '\r\n' is represented by '\r\r\n'.
UPDATE:
@steve-jessop I have solved this problem by using setmode
, which will force stdout
using O_BINARY
mode. So the stream won't translate \n
into \r\n
.
Thanks a lot!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
避免这种情况的方法是不要写
"Hello, world!\r\n"
。fprintf(stdout,"Hello, world!\n");
或std::cout << “你好世界!” << std::endl;
就足够了。这并不是命令行重定向或 stdout 所特有的,对于以字符模式(而不是二进制模式)打开的任何文件描述符也是如此。
The way to avoid it is to not write
"Hello, world!\r\n"
. Eitherfprintf(stdout,"Hello, world!\n");
orstd::cout << "Hello, world!" << std::endl;
is sufficient.This isn't particular to command-line redirection or
stdout
, the same would be true with any file descriptor open in character mode (as opposed to binary mode).'\n' 是与平台无关的换行符表示。它由编译器扩展为您正在编译的平台的实际换行符表示形式 - 对于 Windows 为“\r\n”,对于 *nix 和其他平台(包括 MacOS)为“\n”。
因此,这就是为什么您在十六进制编辑器中看到“\r\r\n”的原因 - 您在源代码中编写的“\r\n”中的“\n”已扩展为“\r\r\n”。
'\n' is the platform-independent newline representation. It's expanded by the compiler to whatever is the actual newline representation for the platform you're compiling for -- '\r\n' for Windows, and '\n' for *nix and friends, including MacOS.
So this is why you see '\r\r\n' in hex editor -- '\n' from '\r\n' that you wrote in source was expanded to '\r\r\n'.