3

私は実験的なネットワーキング プログラムを書いています。基本的には、ネットワーキングを学習するためのテスト プログラムです。Code::Blocks で mingw を使用して SDL と SDL_net を使用しているため、コンソール出力は stdout.txt に送られていました。私は周りを検索し、SDL_Init() の後に含めることでこれを修正できることを発見しました:

freopen("CON", "w", stdout); //stops redirect of output
freopen("CON", "w", stderr); //and errors...

これは完全に機能しましたが、IDE でプログラムをビルドして実行した場合のみ: IDE の外部で実行すると (プログラムをダブルクリックするなど)、プログラムは正常に実行されますが、コンソール出力は空白のままです。プログラムはコンソール プログラムであるはずなので、これは深刻な問題です... プログラムを使用するために常に IDE でプログラムを実行する必要はありません。

どんな解決策も評価されていますが、ピンチではバッチファイルで十分ですが、コードの変更であることが望ましいです(これが機能する唯一のものである投稿をいくつか読みましたが、うまくいきませんでした細かいところまでなので再現できません)。ありがとう。

4

4 に答える 4

2

(MinGW) SDL 2.0 ユーザー向け

SDL 2.0 はデフォルトでコンソールを無効にするか、有効にしません。でコンパイルすると-mwindowsコンソールが無効になるため、stdout は何も指しません。SDL_Log は少し手の込んだもので、Windows API を使用してコンソールを見つけることができますが、stdin をcmd.exe盗んだため :(.

SDL はさまざまな理由でコンソールを要求しません。最も可能性が高いのは、プログラムが でコンパイルされているため-mwindowsです。WinMainエントリ ポイントとして指定するとcmd.exe、コンソールも再利用される可能性があります。私が読んだことから、SDL_mainstdoutとstderrをリダイレクトする可能性があります。

おそらく、#undef'ing main および/または

  • AllocConsole();後に電話するSDL_init(...);
  • 使用するfreopen("CON", stdout)
  • なしでコンパイル-mwindows( #undef'ingmainは効果がないようです)

ただし、実際にはstdoutをたとえばcatにリダイレクトする必要がありますmain | cat(常に「#undef必要がない限りメインにしないでください」というルールに従います)。

TL; DR

stdoutMinGW 用にキャプチャするには、プログラムをcat:にリダイレクトするだけですmain | cat。これは、stdout と stderr が何も指していないことを確認するだけのハックです。との
両方をキャプチャするには、-mwindows を指定せずにコンパイルして、Windows コンソール アプリケーションを作成します。これにより、必要に応じて新しいウィンドウが開きます。 stdinstdout

注: 上記の方法のいずれかを使用する場合は、出力をフラッシュすることが特に重要です。とにかく、ラインバッファリングに頼るのは悪い習慣です。

于 2016-04-19T08:47:44.383 に答える
1

(昨日は評判が悪かったので投稿できませんでした)

さて、バッチファイルの行で少し実験をしました。結果として得られた(ほぼ)動作中のバッチファイル:

program.exe

こんなに簡単だとは思いませんでしたが、プログラムをダブルクリックしてもうまくいかない理由がわかりません。クライアントがサーバーに接続した後、コンソールが空白になるため、ほぼ機能していると言いました。それでも問題があります。それで、私はまだこの問題のどんな助けにも本当に感謝します。

(昨日の投稿予定の終わり)

(今日の答えの始まり)

Emartelの提案を試しましたが、それでもうまくいきませんでした。いくつかのテストを行い、空の文字列を印刷する無限ループがクライアントの接続後に空白の画面の問題を引き起こしていることを発見しました。ループを修正し、バッチスクリプトを使用する必要がありますが、正しく機能するようになりました。

ダブルクリックが機能しない理由を誰かが理解したかどうかを知っていただければ幸いです。

于 2013-01-31T00:18:14.383 に答える
0

SDL Console FAQはご覧になりましたか?

彼らは、次のような多くの提案を提供します。

初挑戦

freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );

うまくいかない場合(あなたの場合のように)、試してください

#include <fstream>
#include <iostream>
using namespace std;
....
ofstream ctt("CON");
freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );
...
ctt.close();

また

FILE * ctt = fopen("CON", "w" );
freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );
...
ctt.close();

もう 1 つのオプションは、SDLmainライブラリを再コンパイルするか、プロジェクトにコードを追加してライブラリSDLmainへのリンクを停止することです。

于 2013-01-30T17:23:42.597 に答える
0

2 つの理由:

  • SDL では、コンソールは無効になっています。SDL は、コンソールではなくウィンドウを使用します。

  • SDL は、標準出力 (cout と printf() の両方) を、*.exe が配置されているディレクトリと同じフォルダーにある stdout.txt という名前のファイルにリダイレクトします。

以下を使用できます。

std::cout << "Hello World";

メッセージは stdout.txt ファイルに保存されます。

于 2013-08-03T04:31:26.227 に答える