web-dev-qa-db-ja.com

C ++ / Windowsでコンソールに出力する方法

LinuxのC++でiostreamを使用すると、ターミナルにプログラム出力が表示されますが、Windowsでは、出力をstdout.txtファイルに保存するだけです。 Windowsで、出力をコンソールに表示するにはどうすればよいですか?

17
Xunil

Stdout.txtについて言及したので、stdout.txtを正確に作成するものを正確に確認しました。通常、Windowsアプリの場合でも、コンソール出力は割り当てられたコンソールに送られます。割り当てられていない場合はどこにも送られません。

したがって、SDL(これがstdout.txtを起動した唯一のもの)を使用していると仮定すると、アドバイス here に従う必要があります。 freopen stdoutおよびstderrに "CON"を付けるか、他のリンカー/コンパイルの回避策をそこで実行します。

リンクが再び壊れた場合、libSDLから参照されたものが次のようになります。

Stdout.txtとstderr.txtを作成しないようにするにはどうすればよいですか?

「SDLに付属するVisual C++プロジェクト内には、SDL_nostdioターゲットがあると思います。>ビルドして、必要なことを実行できます(TM)。」

「「NO_STDIO_REDIRECT」を定義してSDLを再コンパイルすると、問題が解決すると思います。」 >>(ビル・ケンドリックの好意による回答)

17
MSN
13
luke

Visual Studioでデバッグする場合は、デバッグコンソールに出力できます。

OutputDebugStringW(L"My output string.");
7
Sean

コンソールを使用しないWindowsアプリケーションがある場合は、AllocConsole関数を使用してコンソールを作成できます。作成したら、通常のstd :: coutメソッドを使用してそれに書き込むことができます。

5
anon

まず、どのコンパイラまたは開発環境を使用していますか? Visual Studioの場合、コンソール出力を取得するには、コンソールアプリケーションプロジェクトを作成する必要があります。

第二に、

std::cout << "Hello World" << std::endl;

すべてのC++コンソールアプリケーションで動作するはずです。

4
crashmstr

Visual Studioを使用している場合は、プロジェクトプロパティを変更する必要があります:構成プロパティ->Linker->System->SubSystem

これは次のように設定する必要がありますコンソール(/ SUBSYSTEM:CONSOLE)

また、WinMainを次のシグネチャに変更する必要があります。

int main(int argc, char **argv)
{
    //...
    return 0;
}
4
Brian R. Bondy

Subsystem:consoleを使用するか、subsystem:windowsを使用するかは、アプリケーションの起動方法によって異なります。

  • Subsystem:consoleを使用すると、すべてのstdoutが端末に書き込まれます。問題は、[スタート]メニュー/デスクトップからアプリケーションを起動すると、(デフォルトで)コンソールとアプリケーションウィンドウが表示されることです(これはかなり醜く見える場合があります)。
  • Subsystem:windowsを使用する場合、アプリケーションを [〜#〜] dos [〜#〜] window、 Cygwin から実行してもstdout/stderrは取得されません=、または他の端末。

アプリケーションがターミナルで開始された場合にターミナルに出力する中間方法が必要な場合は、Lukeがソリューションで提供したリンク( http://dslweb.nwnexus.com/~ast/ dload/guicon.htm

参考までに、コマンドラインスイッチに応じて、通常のWindowsモードまたはバッチモードで(つまり、スクリプトの一部として)実行したいアプリケーションでこの問題に遭遇しました。コンソールアプリケーションとWindowsアプリケーションの全体的な違いは、Unixの人々には少し奇妙です!

4
AJ.

AllocConsole Windows API関数は、アプリケーションのコンソールウィンドウを作成します。

4
jeffm

Visual Studioを使用している場合は、問題なく動作するはずです。

次にコード例を示します。

#include <iostream>

using namespace std;

int main (int) {
    cout << "This will print to the console!" << endl;
}

新しいプロジェクトを作成するときは、Win32コンソールアプリケーションを選択したことを確認してください。それでも、コンソールスイッチ(>>)を使用して、プロジェクトの出力をファイルにリダイレクトできます。これにより、実際にはコンソールパイプがstdoutからファイルにリダイレクトされます。 (例えば、 myprog.exe >> myfile.txt)。

誤解しないで欲しい!

3
Galilyou

アプリケーションは、Windowsコンソールアプリケーションとしてコンパイルする必要があります。

2
spoulson

Visual Studioのいくつかのバージョンを使用していると思いますか?ウィンドウでは、std::cout << "something";プログラムがプロジェクト設定でコンソールプログラムとして設定されている場合、コンソールウィンドウに何かを書き込む必要があります。

1
Rob K

必ずしもコードを変更する必要はありません(SUBSYSTEMタイプを変更する必要もありません)。必要に応じて、単純に pipestdout and stderr to a console application (Windowsバージョンのcatは正常に動作します)。

0
jamesdlin

良い解決策があります

if (AllocConsole() == 0)
{
    // Handle error here. Use ::GetLastError() to get the error.
}

// Redirect CRT standard input, output and error handles to the console window.
FILE * pNewStdout = nullptr;
FILE * pNewStderr = nullptr;
FILE * pNewStdin = nullptr;

::freopen_s(&pNewStdout, "CONOUT$", "w", stdout);
::freopen_s(&pNewStderr, "CONOUT$", "w", stderr);
::freopen_s(&pNewStdin, "CONIN$", "r", stdin);

// Clear the error state for all of the C++ standard streams. Attempting to accessing the streams before they refer
// to a valid target causes the stream to enter an error state. Clearing the error state will fix this problem,
// which seems to occur in newer version of Visual Studio even when the console has not been read from or written
// to yet.
std::cout.clear();
std::cerr.clear();
std::cin.clear();

std::wcout.clear();
std::wcerr.clear();
std::wcin.clear();
0
YuryChu

MinGW を使用する場合は、オプション-Wl,subsystem,consoleまたは-mconsoleを追加します。

0
Jarekczek