40

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

fflush(stdout)今、最初の後に使用できることがわかりましたがprintf、このソリューションはエレガントで必要でさえないと思います。これをどのように克服できるかについてのアイデアはありますか?

編集- 私は大学でこれを学んでいるので、コースで学ばなかったものは何も使用できないので、使用できるのprintfscanf

新しい編集-これについての説明を見つけたと思います。私が言ったように、私はEclipse内のコンソールビューに出力しています。奇妙なことに、Windows のコマンド ラインからプログラムをコンパイルして実行すると、目的の結果が得られます。したがって、Eclipseは実際には出力をファイルに書き込んでコンソールウィンドウに表示していると思います。実行構成でEclipseに実際のコマンドラインウィンドウを開くように強制するにはどうすればよいですか?

4

7 に答える 7

34

Output is buffered.

stdout is line-buffered by default, which means that '\n' is supposed to flush the buffer. Why is it not happening in your case? I don't know. I need more info about your application/environment.

However, you can control buffering with setvbuf():

setvbuf(stdout, NULL, _IOLBF, 0);

This will force stdout to be line-buffered.

setvbuf(stdout, NULL, _IONBF, 0);

This will force stdout to be unbuffered, so you won't need to use fflush(). Note that it will severely affect application performance if you have lots of prints.

于 2012-10-23T16:43:09.927 に答える
22

どうやらこれはEclipseの既知のバグです。このバグは、WONT-FIXの解決により解決されます。でも理由はわかりません。リンクは次のとおりです: Eclipse CConsoleBug

于 2012-10-27T20:19:36.340 に答える
8

Try setting this before you print:

setvbuf (stdout, NULL, _IONBF, 0);
于 2012-10-23T16:42:58.883 に答える
7

stdout ではなく、stderr への書き込みを試みることができます。

fprintf(stderr, "Hello, please enter your age\n");

この関連スレッドも参照してください。

于 2012-10-23T16:33:29.117 に答える
5

他の人が指摘したように、コンソールまたはシェルがそれを見る機会を得る前に、出力をプログラム内でバッファリングできます。

Mac を含む UNIX ライクなシステムでは、stdoutデフォルトで行ベースのバッファリングがあります。これは、プログラムstdoutが改行を見つけるとすぐにバッファーを空にすることを意味します。

ただし、Windows では、改行は特別なものではなくなり、フル バッファリングが使用されます。Windows は行バッファリングをまったくサポートしていません。setvbuf の msdn ページを参照してください。

したがって、Windows では、次のstdoutようにバッファリングを完全に停止することをお勧めします。

setvbuf (stdout, NULL, _IONBF, 0);
于 2014-06-19T17:52:40.193 に答える
1

システム環境変数として、またはEclipseプロジェクトで環境変数に追加c:\gygwin\binします(プロパティ->実行/デバッグ->編集)PATH

于 2013-10-02T14:04:02.847 に答える