私はC言語で始めています。 IDEとしてEclipse(juno)を使用し、CDTプラグインをインストールしています。また、mingw64(GCC Compiler)を解凍しました。動作するかどうかを確認するための非常に簡単なプログラムを作成しました。これは私のコードです:
#include <stdio.h>
int main()
{
int age;
printf("Hello, please enter your age:\n");
scanf("%d", &age);
printf("Your age is %d", age);
return 0;
}
問題は、出力バッファが最初のprintf
の文字列値で満たされているが、コンソールに出力されないことです。数値を入力する必要があり、その後、バッファーがすべてのデータをコンソールに流し込むため、コンソールは次のように表示されます。
1
Hello, please enter your age:
Your age is 1
予想されるものの代わりに:
Hello, please enter your age:
1
Your age is 1
さて、最初のprintf
の後にfflush(stdout)
を使用できることがわかりましたが、このソリューションはエレガントで、必要でさえないと思います。これを克服する方法についてのアイデアはありますか?
EDIT-私は大学でこれを学んでいるので、コースで学んだことは何も使えないので、できるようにしますonly use printf
およびscanf
NEW EDIT-これについての説明を見つけたと思う。先ほど言ったように、Eclipse内のコンソールビューに出力しています。奇妙なことは、Windowsのコマンドラインからプログラムをコンパイルして実行すると、必要な結果が得られることです。したがって、Eclipseは実際に出力をファイルに書き込み、コンソールウィンドウに表示していると思います。実行構成でEclipseに実際のコマンドラインウィンドウを強制的に開くにはどうすればよいですか?
どうやらこれはEclipseの既知のバグです。このバグは、WONT-FIXの解決により解決されました。なぜだか分かりません。ここにリンクがあります: Eclipse C Console Bug 。
出力はバッファリングされます。
stdoutはデフォルトで行バッファリングされます。つまり、 '\ n'はバッファをフラッシュすることになっています。なぜあなたの場合は起こっていないのですか?ダンノアプリケーション/環境に関する詳細情報が必要です。
ただし、setvbuf()を使用してバッファリングを制御できます。
setvbuf(stdout, NULL, _IOLBF, 0);
これにより、stdoutが強制的に行バッファされます。
setvbuf(stdout, NULL, _IONBF, 0);
これにより、stdoutは強制的にバッファリングされないため、fflush()を使用する必要はありません。大量の印刷がある場合、アプリケーションのパフォーマンスに深刻な影響を与えることに注意してください。
印刷する前にこれを設定してみてください。
setvbuf (stdout, NULL, _IONBF, 0);
Stdoutではなく、stderrへの書き込みを試みることができます。
fprintf(stderr, "Hello, please enter your age\n");
this 関連するスレッドもご覧ください。
他の人が指摘したように、コンソールまたはシェルがそれを見る機会がある前に、プログラム内で出力をバッファリングできます。
Macを含むUnixライクなシステムでは、stdout
にはデフォルトで行ベースのバッファリングがあります。これは、プログラムが改行を見るとすぐにstdout
バッファを空にすることを意味します。
ただし、Windowsでは、改行は特別ではなくなり、完全なバッファリングが使用されます。 Windowsは行バッファリングをまったくサポートしていません。 setvbufのmsdnページ を参照してください。
そのため、Windowsでは、次のようにstdout
バッファリングを完全に停止することをお勧めします。
setvbuf (stdout, NULL, _IONBF, 0);
プロジェクトをビルドした後、以下に示すように、プロジェクトデバッグ>「デバッグ構成」を右クリックします。
「デバッガ」タブで、「GDBコマンドファイル」が「.gdbinit」ファイルを指していることを確認します。それ以外の場合は、「。gdbinit」構成ファイルへのパスを入力します。
「適用」および「デバッグ」をクリックします。以下に示すように、ネイティブDOSコマンドラインを起動する必要があります
c:\gygwin\bin
をPATH
環境変数にシステム環境変数として、またはEclipseプロジェクトで追加します(properties-> run/debug-> edit)