【问题标题】:Is there way to set stdout to binary mode?有没有办法将标准输出设置为二进制模式?
【发布时间】:2014-05-31 05:13:34
【问题描述】:

有没有办法将标准输出设置为二进制模式?没有任何操作的stdout是在哪种模式下,从我的调试问题我假设它是文本模式,是真的吗?

我试过函数:

freopen(NULL,"wb",stdout)

但我的程序在执行时崩溃了。

【问题讨论】:

  • 如果您需要“二进制模式”,请忽略格式化输出 - 坚持使用未格式化输出
  • @DieterLücking 无格式输出与输出是二进制还是文本无关。
  • 这在 Windows 上很有用,因为如果你在 Windows 上执行 fwrite("a\nb", 1, 3, stdout),你最终会写出 "a\r\nb"(注意添加 \r)。这使得无法使用 stdout 作为发送任意二进制数据的通道,这很有用。

标签: c++


【解决方案1】:

我尝试了以下代码将标准输入和标准输出设置为二进制模式(在 Windows 上):

#ifdef _WIN32
  #include <io.h>
  #include <fcntl.h>
#endif
...
#ifdef _WIN32
  setmode(fileno(stdout),O_BINARY);
  setmode(fileno(stdin),O_BINARY);
#endif

在Linux下你不能这样做,因为在这个平台上二进制和文本模式是一回事。

【讨论】:

  • 这行得通。您可以通过执行 fwrite("a\nb", 1, 3, stdout); 来测试它如果生成的文件是 3 个字节,则 stdout 是二进制的。如果没有上面的 setmode() 调用,你最终会得到一个 4 字节的文件。
【解决方案2】:

简单的答案是否定的。模式是在构造iostream对象时确定的,以后不能更改。一些实现可能会提供一种稍后执行此操作的方法,但这不是标准化的。在某些实现中,在stdout 上执行freopen 可能会改变模式,尽管我认为正式地,这在C++ 中是被禁止的。 (它是用 C 定义的实现。)显然,它不适用于您的实现。

最好的办法是找出你的系统如何命名控制台设备(在 Unix 下为"/dev/tty";我认为在 Windows 下为"CONS"),以所需的模式打开它,然后输出到它。

【讨论】:

  • 只是CON 而不是CONS 但这不太可能有帮助 - 在您需要二进制输出的情况下,所述输出不太可能进入控制台。您甚至可能没有 控制台。 (最典型的场景是 CGI 脚本,例如,为 Web 服务器动态生成 JPEG。)
  • 输出可能已被重定向到文件或进程。当进程开始时它通常是打开的,所以“以所需的模式打开它”对我来说意义不大。如果我要 open("/dev/tty", "wb"),那么在一般情况下,这肯定与 /dev/stdout 的目标不同。
猜你喜欢
  • 2019-01-31
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多