を介して新しいコンソールを割り当てた後AllocConsole()
、標準ストリーム ( stdout
、stderr
、stdin
) を使用する前に再度開く必要があります。
を使用してこれを行うことができますfreopen
(Visual Studio の新しいバージョンでは、使用する必要がありますfreopen_s
) 例:
FILE *fDummy;
freopen_s(&fDummy, "CONIN$", "r", stdin);
freopen_s(&fDummy, "CONOUT$", "w", stderr);
freopen_s(&fDummy, "CONOUT$", "w", stdout);
非推奨を使用する場合は、 ingで警告を無効にすることfreopen
ができます。#define
_CRT_SECURE_NO_WARNINGS
ワイド文字ストリーム ( std::wcout
、など) も使用する場合は、 を呼び出してプロセスの新しい出力ハンドルを設定するstd::wcerr
必要があります。/をファイル名として呼び出すことでSetStdHandle()
、これに必要なファイル ハンドルを取得できます。CreateFile()
CONOUT$
CONIN$
HANDLE hConOut = CreateFile(_T("CONOUT$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
SetStdHandle(STD_OUTPUT_HANDLE, hConOut);
さらに、ストリームを再度開く前にストリームの 1 つを使用しようとすると、それらの に と がstd::ios_base::badbit
設定std::ios_base::failbit
されるiostate
ため、その後の書き込み/読み取りは無視されます。
でストリームの状態をリセットでき.clear()
ます。その後、ストリームの読み取り/書き込みを再度行うことができます。
std::cout.clear();
std::cin.clear();
後にすべてのストリームを再度開く完全な例を次に示しますAllocConsole()
。
void CreateConsole()
{
if (!AllocConsole()) {
// Add some error handling here.
// You can call GetLastError() to get more info about the error.
return;
}
// std::cout, std::clog, std::cerr, std::cin
FILE* fDummy;
freopen_s(&fDummy, "CONOUT$", "w", stdout);
freopen_s(&fDummy, "CONOUT$", "w", stderr);
freopen_s(&fDummy, "CONIN$", "r", stdin);
std::cout.clear();
std::clog.clear();
std::cerr.clear();
std::cin.clear();
// std::wcout, std::wclog, std::wcerr, std::wcin
HANDLE hConOut = CreateFile(_T("CONOUT$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hConIn = CreateFile(_T("CONIN$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
SetStdHandle(STD_OUTPUT_HANDLE, hConOut);
SetStdHandle(STD_ERROR_HANDLE, hConOut);
SetStdHandle(STD_INPUT_HANDLE, hConIn);
std::wcout.clear();
std::wclog.clear();
std::wcerr.clear();
std::wcin.clear();
}