我有一个Windows C ++程序正在做类似的事情:
FILE* pf = ...; *stdout = *pf; // stdout is defined in stdio.h
我正在寻找有关更改stdout文件句柄值时会发生什么的说明。这只是重定向stdout的一种方式吗?
-cr
答案 0 :(得分:6)
是的,当您更改stdout时,您实际上是将其重定向到其他位置。但是,您应该不直接分配给stdout。如果要重定向标准输出,则应使用freopen()
。
您永远不应该直接操作FILE对象 - 您应该将它们视为不透明类型,并且只能通过<stdio>
库中的函数与它们进行交互。乔纳森列举了一些很好的理由。
根据C99标准,第7.19.3节,第6段:
用于控制流的FILE对象的地址可能很重要;一份副本 FILE对象无需代替原始对象。
答案 1 :(得分:4)
如果您通过分配更改stdout
而不是使用指定的工具(在C中,freopen()
正如Adam Rosenfield所说 - 并且通过扩展,在C ++中),那么您将自己开放给所有种类负债。
cout
是否也会被重定向。pf
,那么您将承担双重免费错误(崩溃)。干净利落地完成工作要好得多。
(演示代码不一定由供应商编码团队中最有经验的人员编写,甚至仔细检查。如果看起来很可疑,那可能是因为它可疑。)