将标准输出重定向回控制台

4

有很多关于将stdout和stderr重定向到文件而不是控制台的文档。但是如何将其重新定向回来呢?下面的代码显示了我的意图,但仅输出“stdout is printed to console”一次。

我猜我需要获取控制台输出缓冲区,将其存储在某个地方,将stdout重定向到文件,然后恢复控制台缓冲区?

#pragma warning(disable:4996)

#include <cstdio>

int main()
{
    std::printf("stdout is printed to console\n");

    if (std::freopen("redir.txt", "w", stdout)) {
        std::printf("stdout is redirected to a file\n"); // this is written to redir.txt
        std::fclose(stdout);

        std::printf("stdout is printed to console\n");
    }

    getchar();
    return 0;
}

将stdout和stderr重定向到同一个文件并恢复它的方法? - Rene
可能是将stdout和stderr重定向到同一个文件并恢复它的重复问题。 - Peter VARGA
上面的链接间接回答了我的问题,但我没有将其标记为重复,因为下面的答案:1)是直接的答案,2)包含有关弃用的相关信息,我无法将其添加到上述文章中,因为声望不足或因为它并没有回答那个人的实际问题。 - Ben
1个回答

1

感谢上面评论区的文章,我找到了所需的信息。dup和dup2函数是我所需要的。请注意,根据此处的信息,dup和dup2已被弃用,推荐使用_dup和_dup2。MSDN 这里提供了一个可行的示例,但为防止链接失效,下面也复制了该示例。

// crt_dup.c
// This program uses the variable old to save
// the original stdout. It then opens a new file named
// DataFile and forces stdout to refer to it. Finally, it
// restores stdout to its original state.

#include <io.h>
#include <stdlib.h>
#include <stdio.h>

int main( void )
{
   int old;
   FILE *DataFile;

   old = _dup( 1 );   // "old" now refers to "stdout"
                      // Note:  file descriptor 1 == "stdout"
   if( old == -1 )
   {
      perror( "_dup( 1 ) failure" );
      exit( 1 );
   }
   _write( old, "This goes to stdout first\n", 26 );
   if( fopen_s( &DataFile, "data", "w" ) != 0 )
   {
      puts( "Can't open file 'data'\n" );
      exit( 1 );
   }

   // stdout now refers to file "data"
   if( -1 == _dup2( _fileno( DataFile ), 1 ) )
   {
      perror( "Can't _dup2 stdout" );
      exit( 1 );
   }
   puts( "This goes to file 'data'\n" );

   // Flush stdout stream buffer so it goes to correct file
   fflush( stdout );
   fclose( DataFile );

   // Restore original stdout
   _dup2( old, 1 );
   puts( "This goes to stdout\n" );
   puts( "The file 'data' contains:" );
   _flushall();
   system( "type data" );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接