fprintfについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大工

fprintfについて

#1

投稿記事 by 大工 » 16年前

#include <stdio.h>

int main (void) {

  int i, status, value, value2;

  for(i = 0; i < 10; i++) {
     fprintf(stderr, "値1 >>> ");  //エラー出力
     status = scanf(" %d", &value); //値1に入力する.
     if(EOF == status) break;

     fprintf(stderr, "値2 >>> ");  //エラー出力
     status = scanf(" %d", &value2);//値2に入力する.
     if(EOF == status) break;


     fprintf(stderr, "和・差・積\n");
     printf("%2d  %2d  %2d", value + value2, value - value2, value * value2); //和.差.積.
  }

  return 0;
}
printf("%2d %2d %2d", value + value2, value - value2, value * value2);においてCygwin上で表示すると
値1 >>> 3
値2 >>> 4
和・差・積
値1 >>> 7 -1 12

となり

printf("%2d %2d %2d\n", value + value2, value - value2, value * value2);だと
値1 >>> 3
値2 >>> 4
和・差・積
7 -1 12
値1 >>>
となります。こちらが求めているほうです。

気になるのは前者のほうで、なぜfor文のアタマの値1 >>>が先に出力されでから7 -1 12となるのでしょうか?

box

Re:fprintfについて

#2

投稿記事 by box » 16年前

標準出力と標準エラー出力での、
バッファにたまった内容を吐き出すタイミングの
違いではないかと思います。

お使いの処理系では、標準出力は'\n'が来るまで
バッファにたまったままで、
その間に標準エラー出力への出力が来ると、
バッファにたまっている内容を後回しにする、
という動きをしているように思えます。

別の処理系では別の動きをするかもしれません。
別の処理系が使える環境にあれば、そちらでも
同じプログラムを動かして、結果を比べてみては
いかがでしょう。

大工

Re:fprintfについて

#3

投稿記事 by 大工 » 16年前

わかりました!

ありがとうございます。

Hermit

Re:fprintfについて

#4

投稿記事 by Hermit » 16年前

とりあえず、fflush(stdout) を、printf() の後に入れておくのもひとつの手です。

たかぎ

Re:fprintfについて

#5

投稿記事 by たかぎ » 16年前

あるいは、stdoutに対して、setvbufで_IONBFを設定しておくとか。

閉鎖

“C言語何でも質問掲示板” へ戻る