【问题标题】:freopen stdout and consolefreopen 标准输出和控制台
【发布时间】:2011-12-01 15:53:47
【问题描述】:

给定以下函数:

freopen("file.txt","w",stdout);

将 stdout 重定向到一个文件中,如何使 stdout 重定向回控制台?

我会注意到,是的,还有其他类似的问题,但是它们是关于 linux/posix 的。我正在使用 Windows。

您不能分配给标准输出,这会使依赖它的一组解决方案无效。 dup 和 dup2() 不是 Windows 原生的,从而使另一组无效。如前所述,posix 函数不适用(除非您计算 fdopen())。

【问题讨论】:

  • 您尝试过here 发布的一些内容吗?他们是如何失败的? (顺便说一句,freopen 是 POSIX 并且在 Windows 上可用。Windows 有一些 POSIX 支持。)
  • @Mat:这些是针对 posix 系统的,根据问题,这里使用的是 windows。如果它有 posix 支持,您必须澄清它支持的相关(功能)。
  • freopen - 查看左侧的链接。我不需要澄清任何事情。您使用在 Windows 上有效的函数调用发布了一个问题,并且有类似的问题也使用 Windows 上可用的 API。 (需要做研究的是你自己——你是那个被问题困住的人。)
  • you'll have to 不是真的@Mat,或者说其他任何人都不需要,在这里帮助没有人得到报酬。至少对帮助你的人表示一点感激,而不是要求
  • @Als:我对系统不熟悉。如果我知道什么有用什么没用,我就不会问这个问题了。他必须给我看,因为我不认识自己。

标签: c windows stdout


【解决方案1】:

请注意,stdin、stdout、stderr (0,1,2) 的文件描述符与 printf() 等使用的“特殊变量”不同。尽管在大多数情况下,它们会在程序启动时输出到相同的设备。 (如果您在程序中间开始更改内容,或者 tty 重定向已经到位,则不会)。 stdin stdout stderr 是 FILE * 指针。这两个概念都需要用自己的方法相互“重定向”……“dup2”用于复制文件描述符。不是文件指针。对于 FILE * 指针,例如 stdin、stdout、stderr... 'freopen()'.. 但这只会影响 printf 和衍生物。

【讨论】:

    【解决方案2】:

    您应该可以使用_dup 来执行此操作

    这样的事情应该可以工作(或者您可能更喜欢_dup 文档中列出的示例):

    #include <io.h>
    #include <stdio.h>
    
    ...
    {
        int stdout_dupfd;
        FILE *temp_out;
    
        /* duplicate stdout */
        stdout_dupfd = _dup(1);
    
        temp_out = fopen("file.txt", "w");
    
        /* replace stdout with our output fd */
        _dup2(_fileno(temp_out), 1);
        /* output something... */
        printf("Woot!\n");
        /* flush output so it goes to our file */
        fflush(stdout);
        fclose(temp_out);
        /* Now restore stdout */
        _dup2(stdout_dupfd, 1);
        _close(stdout_dupfd);
    }
    

    【讨论】:

      【解决方案3】:

      发布答案后,我注意到这是一个特定于 Windows 的问题。在其他人的问题的背景下,以下内容可能仍然有用。 Windows 还提供 _fdopen,因此可能只需将 0 更改为适当的 HANDLE 即可将此 Linux 解决方案修改为 Windows。

      stdout = fdopen(0, "w")

      #include <stdio.h>
      #include <stdlib.h>
      int main()
      {
          freopen("file.txt","w",stdout);
          printf("dupa1");
          fclose(stdout);
          stdout = fdopen(0, "w");
          printf("dupa2");
          return 0;
      }
      

      【讨论】:

      • fdopen 有效。 dup 和 dup2 不是,而是根据 hasturkun 在 Windows 中称为 _dup 和 _dup2。为努力点赞。 (忽略我所说的编译器错误......我自己的错)。
      • 我会添加那个 stdout = fdopen(0, "w");导致以下错误:需要左值作为赋值的左操作数
      【解决方案4】:

      另一种解决方案是:

      freopen("CON","w",stdout);
      

      根据wikipedia,“CON”是一个特殊关键字,指的是控制台。

      【讨论】:

      • 我试过这个 - Win7,VS2017 - 不幸的是它没有工作
      • 我测试了它,是的,它确实有效。这是我一直在寻找的解决方案。非常感谢您的帮助@dtyler
      • 在什么环境下?对于我来说,只有 _dup2() 的解决方案有效。
      • 实际上 CON: AUX: etc 与 COM1: 或 A: 或 C: .. 相同。设备。只是unix将那些仅放在/ dev /中的物理“文件”和在dos中它们实际上存在于“每个目录中”(大多数版本实际上都有一个错误,如果您专门输入这些名称,dir会显示它们)并没有那么多'特殊关键字'。只是一个引用设备的文件名。像任何其他字符或块设备一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      相关资源
      最近更新 更多