3

我有一个 Windows C++ 程序正在执行以下操作:

  文件* pf = ...;
  *标准输出= *pf;// stdout 在 stdio.h 中定义

我正在寻找有关更改标准输出文件句柄的值时会发生什么的解释。这只是重定向标准输出的一种方式吗?

-cr

4

2 回答 2

6

是的,当您更改标准输出时,您实际上是在将其重定向到其他地方。但是,您不应该像那样直接分配给标准输出。如果你想重定向标准输出,你应该使用freopen().

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

来自 C99 标准,第 7.19.3 节,第 6 段:

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

于 2008-12-17T21:49:41.183 回答
4

如果您stdout通过分配而不是使用指定的工具进行更改(在 C 中,freopen()正如 Adam Rosenfield 所说 - 并且通过扩展,在 C++ 中),那么您会让自己承担各种责任。

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

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

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

于 2008-12-17T21:56:19.703 回答