LinuxのC++でiostreamを使用すると、ターミナルにプログラム出力が表示されますが、Windowsでは、出力をstdout.txtファイルに保存するだけです。 Windowsで、出力をコンソールに表示するにはどうすればよいですか?
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を再コンパイルすると、問題が解決すると思います。」 >>(ビル・ケンドリックの好意による回答)
トピックには gamedev.netのスレッド全体 があります。
Visual Studioでデバッグする場合は、デバッグコンソールに出力できます。
OutputDebugStringW(L"My output string.");
コンソールを使用しないWindowsアプリケーションがある場合は、AllocConsole関数を使用してコンソールを作成できます。作成したら、通常のstd :: coutメソッドを使用してそれに書き込むことができます。
まず、どのコンパイラまたは開発環境を使用していますか? Visual Studioの場合、コンソール出力を取得するには、コンソールアプリケーションプロジェクトを作成する必要があります。
第二に、
std::cout << "Hello World" << std::endl;
すべてのC++コンソールアプリケーションで動作するはずです。
Visual Studioを使用している場合は、プロジェクトプロパティを変更する必要があります:構成プロパティ->Linker->System->SubSystem。
これは次のように設定する必要がありますコンソール(/ SUBSYSTEM:CONSOLE)
また、WinMainを次のシグネチャに変更する必要があります。
int main(int argc, char **argv)
{
//...
return 0;
}
Subsystem:consoleを使用するか、subsystem:windowsを使用するかは、アプリケーションの起動方法によって異なります。
アプリケーションがターミナルで開始された場合にターミナルに出力する中間方法が必要な場合は、Lukeがソリューションで提供したリンク( http://dslweb.nwnexus.com/~ast/ dload/guicon.htm )
参考までに、コマンドラインスイッチに応じて、通常のWindowsモードまたはバッチモードで(つまり、スクリプトの一部として)実行したいアプリケーションでこの問題に遭遇しました。コンソールアプリケーションとWindowsアプリケーションの全体的な違いは、Unixの人々には少し奇妙です!
AllocConsole Windows API関数は、アプリケーションのコンソールウィンドウを作成します。
Visual Studioを使用している場合は、問題なく動作するはずです。
次にコード例を示します。
#include <iostream>
using namespace std;
int main (int) {
cout << "This will print to the console!" << endl;
}
新しいプロジェクトを作成するときは、Win32コンソールアプリケーションを選択したことを確認してください。それでも、コンソールスイッチ(>>)を使用して、プロジェクトの出力をファイルにリダイレクトできます。これにより、実際にはコンソールパイプがstdoutからファイルにリダイレクトされます。 (例えば、 myprog.exe >> myfile.txt
)。
誤解しないで欲しい!
アプリケーションは、Windowsコンソールアプリケーションとしてコンパイルする必要があります。
Visual Studioのいくつかのバージョンを使用していると思いますか?ウィンドウでは、std::cout << "something";
プログラムがプロジェクト設定でコンソールプログラムとして設定されている場合、コンソールウィンドウに何かを書き込む必要があります。
必ずしもコードを変更する必要はありません(SUBSYSTEM
タイプを変更する必要もありません)。必要に応じて、単純に pipestdout and stderr to a console application (Windowsバージョンのcat
は正常に動作します)。
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();
MinGW を使用する場合は、オプション-Wl,subsystem,console
または-mconsole
を追加します。