zoukankan      html  css  js  c++  java
  • Redirecting Standard I/O to Windows Console

    Redirecting Standard I/O to Windows Console

    Warning! Some information on this page is older than 5 years now. I keep it for reference, but it probably doesn't reflect my current knowledge and beliefs.

    # Redirecting Standard I/O to Windows Console

    20:10 
    Sat 
    28 
    Nov 2009

    Every process, no matter if under Windows or Linux, has standard text streams called input, output and error. Of course it makes most sense when you deal with command line applications, where you can directly interact with it using these streams. If you use Linux, you are probably familiar with redirecting streams to file using > operator or to another application using | operator. We use these streams in C++ code with standard C library (like printf and scanf functions) or standard C++ library (like std::cout and std::cin streams). But what if we write a GUI application in Windows (like a game), which has WinMain instead of main entry point and thus doesn't have console?

    There is a simple WinAPI function called AllocConsole, which opens this black system console for your Win32 application. But today I've noticed that the console opened this way doesn't handle standard I/O! I've tried to do std::cout << "Hello World" and nothing happened. So after some googling I've found a hacky solution (or maybe rather a smart code snippet? :) in an article hosted at Andrew Tucker's Home Page, published in 1997 in Windows Developer Journal: Adding Console I/O to a Win32 GUI App. Here is my version of this code with all necessary includes:

    #include <windows.h>
    #include <ios>
    #include <cstdio>
    #include <io.h>
    #include <fcntl.h>
    
    void RedirectStandardIo()
    {
      /* This clever code have been found at:
      Adding Console I/O to a Win32 GUI App
      Windows Developer Journal, December 1997
      http://dslweb.nwnexus.com/~ast/dload/guicon.htm
      Andrew Tucker's Home Page */
    
      // redirect unbuffered STDOUT to the console
      long lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
      int hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
      FILE *fp = _fdopen(hConHandle, "w");
      *stdout = *fp;
      setvbuf(stdout, NULL, _IONBF, 0);
    
      // redirect unbuffered STDIN to the console
      lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
      hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
      fp = _fdopen( hConHandle, "r" );
      *stdin = *fp;
      setvbuf(stdin, NULL, _IONBF, 0);
    
      // redirect unbuffered STDERR to the console
      lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
      hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
      fp = _fdopen( hConHandle, "w" );
      *stderr = *fp;
      setvbuf(stderr, NULL, _IONBF, 0);
    
      // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well
      std::ios::sync_with_stdio();
    }

    Comments | #winapi ShareFacebookGoogle+TwitterLinkedIn

  • 相关阅读:
    饮冰三年-人工智能-Python-35权限管理(万能的权限通用模块)
    饮冰三年-人工智能-Python-34CRM项目实战
    饮冰三年-人工智能-Python-33权限管理(通过配置快速生成列表)
    集腋成裘-15-MongoDB系列-02Find详细
    集腋成裘-14-MongoDB系列-01初识MongoDB
    饮冰三年-人工智能-Python-33博客园山寨版之报障管理
    饮冰三年-人工智能-Python-32博客园山寨版之后台管理
    JVM内存管理
    连接池实现原理
    定时器
  • 原文地址:https://www.cnblogs.com/jefflee/p/7661132.html
Copyright © 2011-2022 走看看