45

ネイティブ C++ Windows プログラム (つまり、エントリ ポイントが WinMain) を使用している場合、std::cout などのコンソール関数からの出力を表示するにはどうすればよいですか?

4

11 に答える 11

30

Adding Console I/O to a Win32 GUI App を確認してください。これは、あなたが望むことをするのに役立つかもしれません.

コードがない場合、またはコードを変更できない場合は、ここにある提案を試して、コンソール出力をファイルにリダイレクトしてください。


編集:ここにスレッドネクロマンシーのビット。私が最初にこれに答えたのは、SO の初期の 9 年前、非リンクのみの回答の (良い) ポリシーが発効する前でした。過去の罪を償うために、元の記事のコードを再投稿します。

guicon.cpp -- コンソールリダイレクト機能

#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <fstream>
#ifndef _USE_OLD_IOSTREAMS
using namespace std;
#endif
// maximum mumber of lines the output console should have
static const WORD MAX_CONSOLE_LINES = 500;
#ifdef _DEBUG
void RedirectIOToConsole()
{
    int hConHandle;
    long lStdHandle;
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    FILE *fp;

    // allocate a console for this app
    AllocConsole();

    // set the screen buffer to be big enough to let us scroll text
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
    coninfo.dwSize.Y = MAX_CONSOLE_LINES;
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

    // redirect unbuffered STDOUT to the console
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    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
    ios::sync_with_stdio();
}

#endif
//End of File

guicon.h -- コンソール リダイレクト機能へのインターフェイス

#ifndef __GUICON_H__
#define __GUICON_H__
#ifdef _DEBUG

void RedirectIOToConsole();

#endif
#endif

// End of File

test.cpp -- コンソール リダイレクトのデモ

#include <windows.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdio.h>
#ifndef _USE_OLD_OSTREAMS
using namespace std;
#endif
#include "guicon.h"


#include <crtdbg.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    #ifdef _DEBUG
    RedirectIOToConsole();
    #endif
    int iVar;

    // test stdio
    fprintf(stdout, "Test output to stdout\n");
    fprintf(stderr, "Test output to stderr\n");
    fprintf(stdout, "Enter an integer to test stdin: ");
    scanf("%d", &iVar);
    printf("You entered %d\n", iVar);

    //test iostreams
    cout << "Test output to cout" << endl;
    cerr << "Test output to cerr" << endl;
    clog << "Test output to clog" << endl;
    cout << "Enter an integer to test cin: ";
    cin >> iVar;
    cout << "You entered " << iVar << endl;
    #ifndef _USE_OLD_IOSTREAMS

    // test wide iostreams
    wcout << L"Test output to wcout" << endl;
    wcerr << L"Test output to wcerr" << endl;
    wclog << L"Test output to wclog" << endl;
    wcout << L"Enter an integer to test wcin: ";
    wcin >> iVar;
    wcout << L"You entered " << iVar << endl;
    #endif

    // test CrtDbg output
    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR);
    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR);
    _RPT0(_CRT_WARN, "This is testing _CRT_WARN output\n");
    _RPT0(_CRT_ERROR, "This is testing _CRT_ERROR output\n");
    _ASSERT( 0 && "testing _ASSERT" );
    _ASSERTE( 0 && "testing _ASSERTE" );
    Sleep(2000);
    return 0;
}

//End of File
于 2008-10-10T15:29:50.243 に答える
15

cout および cerr ストリームを再度開いて、ファイルに出力することもできます。これには、以下が機能するはずです。

#include <iostream>
#include <fstream>

int main ()
{
    std::ofstream file;
    file.open ("cout.txt");
    std::streambuf* sbuf = std::cout.rdbuf();
    std::cout.rdbuf(file.rdbuf());
    //cout is now pointing to a file
    return 0;
}
于 2008-10-10T15:35:59.983 に答える
2

これについて私を引用しないでください。ただし、Win32コンソール APIが探しているものかもしれません。ただし、デバッグ目的でこれを行っているだけの場合は、DebugView を実行して DbgPrint 関数を呼び出すことに関心があるかもしれません。

もちろん、これは、別のアプリケーションから読み取るのではなく、コンソール出力を送信するアプリケーションを想定しています。その場合、パイプはあなたの味方かもしれません。

于 2008-10-10T15:28:05.833 に答える
1

あちこちで述べたよう、最も簡単な解決策は、プロジェクト プロパティ ページを使用してサブシステムを切り替えたり、コンソール出力を自由に有効または無効にしたりすることです。CONSOLEWINDOWS

プロジェクトのプロパティ

両方の構成がコンパイルされていることを確認するためにmain、プログラムに必要なのはエントリ ポイントだけです。たとえば、以下に示すようにWinMain単純mainに呼び出す関数:WinMain

int main()
{
cout << "Output standard\n";
cerr << "Output error\n";

return WinMain(GetModuleHandle(NULL), NULL, GetCommandLineA(), SW_SHOWNORMAL);
}
于 2019-07-01T11:14:52.703 に答える
0

コンソール ウィンドウがないので、これは不可能です。(毎日何か新しいことを学びましょう - コンソールの機能については知りませんでした!)

出力呼び出しを置き換えることは可能ですか? 多くの場合、TRACE または OutputDebugString を使用して、情報を Visual Studio の出力ウィンドウに送信します。

于 2008-10-10T15:24:13.517 に答える