2011-09-05 9 views
1

私はいくつかのユーザー入力をキャプチャして、構造体とファイルの両方に保存しています。scanfが実行順序を変更するのはなぜですか?

フィールドごとに、まずprintfを使用してプロンプトを書き込み、scanfを使用して構造体にデータをキャプチャし、最後にfprintfを使用してファイルに書き込みます。

プログラムは正常に動作しますが、1台のコンピュータでのみ、scanfが対応するprintfの前に実行されます。

ここで問題の核心だ:

printf("\n color: "); 
scanf("%s",&robot1.color); 
fputs(robot1.color, f); 
fputs("\n",f); 

printf("\n energy: "); 
scanf("%d",&robot1.energy); 
fprintf(f,"%d",robot1.energy); 
fputs("\n",f); 

printf("\n height: "); 
scanf("%f",&robot1.height); 
fprintf(f,"%.2f",robot1.height); 
fputs("\n",f); 

printf("\n weight: "); 
scanf("%f",&robot1.weight); 
fprintf(f,"%.2f",robot1.weight); 
fputs("\n",f); 

私はDev-C++を使用して2台のWindows PC上でそれをテストし、Mac上でGCCを使用。 Windowsマシンの1つが、この混乱の原因となるものです。

正しい実行は、(ユーザー入力を含む)である:

color: red 
energy: 100 
height: 30.5 
weight: 500.0 

しかし、面倒なコンピュータで

、I入力エネルギー値の後に、それは何も示していない、と私は入力に高さの値を持って継続します。その後 は、私は体重を捕捉することによって、身長と体重促し、そしてフィニッシュを参照してください。

color: red 
energy: 100 
30.5 
height: 
weight: 500.0 

ファイルがそのように、すべての場合に正しく書かれている、なぜ1台のコンピュータのみがscanfprintfとのトラブルをしていますか?

構造体の定義は次のとおりです。

typedef struct roboto 
{ 
    char name[10]; 
    char color[10]; 
    int energy; 
    float height; 
    float weight; 
}robot; 

答えて

3

私はstdout、ユーザが入力を求めるプロンプトが表示されている前にフラッシュされていないとの問題を推測しています。これを修正するには、fflush(stdout);を使用して各print文の後にstdoutをフラッシュすることができます。たとえば、次のようになります。

printf("\n color: "); 
fflush(stdout); 
scanf("%s",&robot1.color); 
fputs(robot1.color, f); 
fputs("\n",f); 
+0

これはうまくいかず、他の提案はありますか?なぜこれがちょうど1台のコンピュータで起こるかの考えですか? – ghopper3

+1

そのコンピュータで別のコンパイラまたはOSを使用していますか? – GWW

2

標準出力はバッファリングされているため、書き込むタイミングを確認できません。 を呼び出した後に出力を書き込むには、fflush(stdout)を呼び出すと、出力が書き込まれることを確認できます。

+0

ありがとう、しかし、他の答えに記載されているように、これは動作していない、他のアイデア? – ghopper3

+0

あなたのコードがなぜ機能しないのか分かりません。 もう一つの試みは、 'write'や' _write'システムコールを使って、 'printf'の代わりに直接ファイル記述子1(stdout)にメッセージを書き込むことです。 –

0

戻り値をscanfから確認すると、手がかりが得られるかもしれません。その値を無視するだけで問題を尋ねるだけです。

関連する問題