2014-04-16 62 views
8

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

我试图函数:

freopen(NULL,"wb",stdout)

,但我的计划是崩溃,当我这样做。

+1

为什么? 'stdout'应该与文本终端兼容。根据当前语言环境获取文本语义。 (请注意,C和C++有不同的语言环境系统,并且您需要采取积极措施使库语言环境与操作系统语言环境匹配。) – Potatoswatter

+0

如果您需要'二进制模式'省略格式化输出 - 坚持未格式化输出 –

+0

出于何种目的?听起来像个坏主意...... – tenfour

回答

10

我尝试下面的代码提交给设置stdin和stdout为二进制模式(在Windows上):

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

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

+0

这可以工作。你可以通过做 fwrite(“a \ nb”,1,3,stdout)来测试它。 如果生成的文件是3个字节,则stdout是二进制的。如果没有上面的setmode()调用,你最终会得到一个4字节的文件。 –

0

简单的答案是否定的。该模式在iostream对象被构建时确定,并且以后不能更改。有些实现可能会提供稍后执行的手段,但这不是标准化的。在一些实现中,在stdout上执行freopen可能会改变模式,尽管我认为这是正式的,但这在C++中是被禁止的。 (它是在C中定义的实现)显然,它不适用于你的实现。

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

+1

只需'CON'而不是'CONS',但这不可能有所帮助 - 在需要二进制输出的情况下,所述输出不太可能会转到控制台。你可能甚至不会拥有一个控制台。 (最典型的场景是一个CGI脚本,例如,为Web服务器动态生成JPEG。) –

相关问题