用 freopen 把标准输出重定向到文件再重定向回来,之后为什么无法获取 CONSOLE_SCREEN_BUFFER_INFO ?

黄铎彦 20 Reputation points
2023-06-26T13:19:42.9766667+00:00
#include <stdio.h> 
#include <Windows.h>
#define FILENAME    "data.txt" // 数据文件名
   
/// <summary>重定向标准输出流到某个文件</summary> 
/// <param name="filename"> 
/// 文件名。如果原来的文件存在,则覆盖它;否则新建一个文件。 
/// <para>如果想要将标准输出重定向到控制台,请再次使用此宏,文件名填 "con", 
/// 即 Windows 的控制台文件。</para> 
/// </param> 
#define REDIR_STDOUT(filename) assert(freopen(filename, "w", stdout) != NULL)   

// ...
         case 4: // 保存链表的数据到文件。
         {
             REDIR_STDOUT(FILENAME);
             pri_dates(&l);
             REDIR_STDOUT("con");
         }
             break;   

// ...
         HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); // 输出句柄
         CONSOLE_SCREEN_BUFFER_INFO csbi;
         assert(GetConsoleScreenBufferInfo(hout, &csbi)); // 断言失败,返回ERROR_ACCESS_DENIED!

pri_dates(&l); 中,l 是链表,这个调用的意思是在屏幕上打印日期链表的内容。用"con"重定向回控制台的时候还是可以在屏幕上输出内容的。后面的 Win32 API 调用部分是因为“分屏输出文件内容”这一功能的需要才增加的。如果没有重定向的话 csbi 的信息可以正常获取,断言成功。不知道为什么无法获取 csbi 的信息,难道是 hout 获取到了非法的句柄了吗?

Windows development | Windows API - Win32
Developer technologies | C++
{count} votes

Accepted answer
  1. Castorix31 90,686 Reputation points
    2023-06-26T19:06:11.5933333+00:00

    [The language of those forums is english]

    Use :

    #define REDIR_STDOUT(filename) freopen(filename,"w+",stdout)
    
    

    and

     REDIRECT_STDOUT("CONOUT$")
    
    1 person found this answer helpful.

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.