標準入力も関連付ける


標準出力、標準エラー出力のときと同じような方法で標準入力も割り当てることができます
//標準出力を指定し、標準出力関数を使ってみる
//標準エラーも出力される
//標準入力関数も使えるようにする
//UNICODEコンパイル対応
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>

#define BUF_SIZE    (256)   //バッファサイズ

//割り込み制御
BOOL WINAPI HandlerRoutine(DWORD type)
{
    switch(type)
    {
    case CTRL_C_EVENT:      //Ctrl+Cを受け取った
    case CTRL_BREAK_EVENT:  //Ctrl+Breakを受け取った
    case CTRL_CLOSE_EVENT:  //コンソールを閉じた
        return TRUE;        //無効にするのでTRUEを返す
    case CTRL_LOGOFF_EVENT:
    case CTRL_SHUTDOWN_EVENT:
        return FALSE;
    }
    return FALSE;           //それ以外の時は強制終了
}

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    int     hStdOut, hStdErr, hStdIn;
    TCHAR   buf[BUF_SIZE];

    ::AllocConsole();     //コンソール割り当て

    //標準出力関連付け
    hStdOut = ::_open_osfhandle((intptr_t)::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
    *stdout = *::_tfdopen(hStdOut, TEXT("w"));
    ::setvbuf(stdout, NULL, _IONBF, 0);

    //標準エラー出力関連付け
    hStdErr = ::_open_osfhandle((intptr_t)::GetStdHandle(STD_ERROR_HANDLE), _O_TEXT);
    *stderr = *::_tfdopen(hStdErr, TEXT("w"));
    ::setvbuf(stderr, NULL, _IONBF, 0);

    //標準入力関連付け
    hStdIn = ::_open_osfhandle((intptr_t)::GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
    *stdin = *::_tfdopen(hStdIn, TEXT("r"));
    ::setvbuf(stdin, NULL, _IOFBF, 256);

    //割り込みハンドラ関数追加
    ::SetConsoleCtrlHandler(HandlerRoutine, TRUE);
    
    //ロケールの設定
    ::_tsetlocale(LC_ALL, TEXT("japanese"));
    
    ::_tprintf_s(TEXT("標準出力\n"));
    ::_ftprintf_s(stderr, TEXT("エラー出力\n"));

    ::_tprintf_s(TEXT("in ->"));
    ::_tscanf_s(TEXT("%s"), buf, 256);      //文字入力
    ::_tprintf_s(TEXT("out->%s"), buf);

    ::MessageBox(NULL, TEXT("ストッパーです"), TEXT("AllocConsole"), MB_OK);
    ::FreeConsole();      //コンソールを解放します
    ::_close(hStdOut);    //ハンドルを閉じます
    ::_close(hStdErr);
    ::_close(hStdIn);

    return 0;
}
標準入力関数で入力
GetStdHandleがSTD_INPUT_HANDLEで呼び出しています
開いたハンドルをstdinに関連付けています
このとき_tfdopen関数は"r"を指定し、読み出しモードで開きます
setvbufでは_IOFBFとバッファサイズを指定し、フルバッファリングを行います


TOPプログラミング>標準入力も関連付ける