在C ++程序中更改stdout的值

时间:2008-12-17 21:45:35

标签: c++ c stdout filehandle

我有一个Windows C ++程序正在做类似的事情:

  FILE* pf = ...;
  *stdout = *pf;    // stdout is defined in stdio.h

我正在寻找有关更改stdout文件句柄值时会发生什么的说明。这只是重定向stdout的一种方式吗?

-cr

2 个答案:

答案 0 :(得分:6)

是的,当您更改stdout时,您实际上是将其重定向到其他位置。但是,您应该直接分配给stdout。如果要重定向标准输出,则应使用freopen()

您永远不应该直接操作FILE对象 - 您应该将它们视为不透明类型,并且只能通过<stdio>库中的函数与它们进行交互。乔纳森列举了一些很好的理由。

根据C99标准,第7.19.3节,第6段:

  

用于控制流的FILE对象的地址可能很重要;一份副本   FILE对象无需代替原始对象。

答案 1 :(得分:4)

如果您通过分配更改stdout而不是使用指定的工具(在C中,freopen()正如Adam Rosenfield所说 - 并且通过扩展,在C ++中),那么您将自己开放给所有种类负债。

  • 目前尚不清楚cout是否也会被重定向。
  • 您可能会泄漏文件描述符(这可能无关紧要)。
  • 您可能无法正确刷新原始标准输出 - 丢失信息。
  • 您可能会泄漏与原始文件指针相关的内存(这可能无关紧要)。
  • 如果有任何关闭pf,那么您将承担双重免费错误(崩溃)。

干净利落地完成工作要好得多。

(演示代码不一定由供应商编码团队中最有经验的人员编写,甚至仔细检查。如果看起来很可疑,那可能是因为它可疑。)