ページ 11

fprintfについて

Posted: 2007年9月26日(水) 22:26
by 大工
#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となるのでしょうか?

Re:fprintfについて

Posted: 2007年9月26日(水) 22:54
by box
標準出力と標準エラー出力での、
バッファにたまった内容を吐き出すタイミングの
違いではないかと思います。

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

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

Re:fprintfについて

Posted: 2007年9月26日(水) 23:05
by 大工
わかりました!

ありがとうございます。

Re:fprintfについて

Posted: 2007年9月27日(木) 19:46
by Hermit
とりあえず、fflush(stdout) を、printf() の後に入れておくのもひとつの手です。

Re:fprintfについて

Posted: 2007年9月27日(木) 21:08
by たかぎ
あるいは、stdoutに対して、setvbufで_IONBFを設定しておくとか。