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

发布于 2024-11-26 23:53:14 字数 516 浏览 1 评论 0原文

我发现 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

未央 2024-12-03 23:53:14

避免这种情况的方法是不要写 "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". Either fprintf(stdout,"Hello, world!\n"); or std::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).

偷得浮生 2024-12-03 23:53:14

'\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'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文