• ベストアンサー

stdoutとstderr

どうして下記のソースの実行結果が"ba"となってしまうのでしょうか? ("ab"とならない事を言っています) 皆さん宜しくお願いします<(_ _)> int main(void) { fprintf(stdout,"a"); fprintf(stderr,"b"); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ウチの環境では、"ab"になりました。 多分、バッファリングとフラッシュのタイミングの問題じゃないでしょうか #include <stdio.h> int main(void) { fprintf(stdout,"a"); fflush(stdout); fprintf(stderr,"b"); return 0; } とかしてみたらどうなりますか

whisky
質問者

お礼

有り難う御座います、仰るとおりfflushを用いてバッファのフラッシュを意図的に行う事で解決しました。 ご自身でも試して頂くなど手間暇かけて頂き本当に有り難う御座いました<(_ _)>

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

"a"は直ちに表示されるわけではない。 改行が入るまで待ってます。 そこへエラーメッセージが来た! エラーなんだから、緊急に表示しなくちゃいけない。 そういうわけありで、"b"のほうが先に表示されるのだと思いますが。 仕様の問題ではないでしょうか。 stdout…改行単位で出力。 stderr…文字単位で出力。

whisky
質問者

お礼

例を挙げて分かり易く説明頂き有り難う御座います。 >仕様の問題ではないでしょうか。 自分でも"\n"を挟むなどして試した所仰るとおりstdoutでは改行毎に表示されるという事が体感できました。 お蔭で理解が深まりました、有り難う御座いました(*- -)(*_ _)ペコリ

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • stderrとstdout

    次のようなプログラムを、./a.outと./a.out>out.txtのように実行したところ、前者は output1 後者は output1 output2 output3 のようになりましたが、なぜこうなるか理由がわかりません。 自分では、stderrとstdoutが関係してるのだと思うのですが、初心者なのでこれらがどういうプログラムなのかもよくわかっていません。どなかなぜこうなるのか教えていただけないでしょうか。 #include<stdio.h> int main(int argc,char **argv){ fprintf(stderr,"output1\n"); fprintf(stdout,"output2\n"); printf("output3\n") }

  • hello worldの表示の仕方

    2年ほど前、プログラムを教わっていたのですがすっかり忘れてしまいました メモ帳に #include <stdio.h> int main() { fprintf(stdout, "Hello world No1!\n"); fflush(stdout); fprintf(stderr, "Hello world No2!\n"); fflush(stderr); return 0; } と書く helloworldという名前で保存する アクセサリからコマンドプロンプトを立ち上げる helloworldと入力しエンターを押す これでhello wordと表示されると思うのですが、何故か表示されません 初歩の初歩すらすっかり忘れてしまいました どなたか何を間違えているのか教えてください 昔はこのPC実行できたと思うのですが…ちないにvistaのノートパソコンです お願いします

  • パイプってどうやって使うの?

    1つ目のプログラムの出力を2つ目のプログラムで受け取りたいのですが、どうすればいいですか? -- 1 -- #include <stdio.h> #include <windows.h> int main(void){     int a=0;     while(1){         fprintf(stdout,"%d\n",a++);         Sleep(1000);     }     return 0; } これを2のプログラムで受け取ります。 #include <stdio.h> int main(void){     char str[128];     while(1){         if(fgets(str,sizeof(str),stdin)==NULL)             break;     printf("%s",str);     }     return 0; } これをコマンドプロンプトで 1 | 2 と入力してみましたが、何も表示されません・・。 個別に実行すると正常に動作します。 環境はXPです。どうしたら受け渡しが出来るのでしょうか?

  • stdin,stdoutについて

    C言語を学び始めたものです stdin・stdoutがどのように機能するか分かりません またstdoutはどこに出力しているんですか #include <stdio.h> int main(void) { char ch; while(!feof(stdin)) { scanf("%c", &ch); if(!feof(stdin)) printf("%c", ch); } return 0; } このプログラムは「コンソール」入出力関数だけを使用しテキストファイルの内容を別のテキストファイルにコピーするプログラムだそうですがどのテキストファイルの内容をどこのテキストファイルにコピーしているんですか?stdin・stdoutの機能が全く分かりません。 どなたか分かる方、回答お願いします。

  • グローバル変数について

    ◎1--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; glb=30; printf("main a=%d glb=%d\n",a,glb); func(); return 0; } void func(void) { int b=88; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎1の実行結果----------------------- main a=20 glb=30 func b=88 glb=30 ------------------------------------- ◎2--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; func(); printf("main a=%d glb=%d\n",a,glb); return 0; } void func(void) { int b=88; int glb=30; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎2の実行結果----------------------- func b=88 glb=30 main a=20 glb=0 ------------------------------------- 以上2つのプログラムで、◎1は参考書を参考に作成したものです。 ◎1のプログラムで、グローバル変数glbの値をmain( )関数内で設定していたので、次に◎2のようにfunc( )という関数プロトタイプ内で、グローバル変数glbの値を設定し、main( )関数内のprintf文でも表示させようと思ったら、「glb=0」となってしまいました。 なぜこのようになってしまうか、教えてもらえたら嬉しいです。

  • プログラムがわかりません

    C言語の本を読んでいるんですが、詰まってしまいました。プログラム自体は単純なのですが #include<stdio.h> void hello(void) { fprintf(stderr,"hello!\n"); } void func(void) { void *buf[10]; static int i; for(i=0;i<10;i++) { buf[i] = hello; } } int main(void) { int buf[100]; func(); return 0; } のスタックオーバーフローのプログラムです。 1. 要素100のint型配列を宣言 2. 関数funcの呼び出し 3. void *buf[10]; まずここでがわかりません。なぜポインタが   でてきたのか?またbufの要素数は100では? 4. buf[i] = hello; のループ    これもわかりません。配列に関数を代入しているのでしょうか?     5.  fprintf(stderr,"hello!\n"); これもまたわかりません。    fprintfの最初の引数は出力先ですが、なぜ標準エラー出力なの   でしょうか? 時間のあるかた解説お願いします。

  • C言語でO-Notepad-x,文字化け。

    いつも大変お世話になりありがとうございます。 標記の件。 ボクはTeraPadをエディターに使っています。 コードとコンパイル、実行がおかしくなりました。 コードと実行は下記の通りです。 #include <stdio.h> int main(void) { int a = 0; int b = 0; b = a++; printf("代入後にインクリメントしたのでbの値は%dです。\n", b); return 0; } C:\MinGW>gcc test1.c -o test1 C:\MinGW>test1.c 実行するとO-Notepad-xと言うのが起ち上がって #include <stdio.h> int main(void) { int a = 0; int b = 0; b = a++; printf(" ɃC N g ̂ b ̒l %d ł B\n", b); return 0; } という結果になりました。 どうしてでしょうか? ご回答の程、宜しくお願い申し上げます。

  • オープンモードについて

    この下のソースを実行するとファイルの中身が「97へ」と出ます。 この「へ」とは何なのでしょうか?97にしたいのですが、どうすればよいのでしょうか?またなぜこのような結果になってしまったのでしょうか? int main(void) { FILE *fp; int d=97; fp=fopen("txt.txt","w+"); fprintf(fp,"%d",d); fscanf(fp,"%d",&d); printf("%d",d); fclose(fp); return 0; } 環境はVCC++2005です。

  • staticで初期化した変数(?)を使って初期化

    次の3つのプログラム、1番目はコンパイルエラーになりますが、下2つはエラーになりません。1番目のプログラムのエラーメッセージ:初期化子が定数ではありません。 処理系にかかわらずそうだとしたら、その理由はなんでしょうか。 ---------------------------------- int main(void) { static int a=5; static int b=a; return 0; } ---------------------------------- int main(void) { static int a=5; int b=a; return 0; } ---------------------------------- int main(void) { int a=5; int b=a; return 0; }

  • 多次元配列の new 2

    追加の質問ですみません^^; char の8個の配列へのポインタの配列を new する場合などは、以下のサンプルのように typedef しないとかけないんでしょうかね?たとえば、  char (**bb)[8] = new (char (*)[8])[8]; 書きたいように思いますが、これは文法違反ですし・・・^^; ==== サンプル:(iostream の初期化時に、定義した new が呼び出されるかもしれないことを一応考慮して、stdio の関数を使っています^^) #include <new> #include <stdlib.h> #include <stdio.h> void *operator new(std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new(): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete(void *p) { fprintf(stderr, "::delete(): %p\n", p); if (p) free(p); } void *operator new[](std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new[](): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete[](void *p) { fprintf(stderr, "::delete[](): %p\n", p); if (p) free(p); } int main() { typedef char (*T)[8]; char (**b)[8] = new T[8]; delete[] b; } ==== % ./a.exe ::new[](): 0x6e01b0 32 ::delete[](): 0x6e01b0

このQ&Aのポイント
  • ウーバーイーツで注文した料理が時間ギリギリに到着し、冷めていたため不満を感じた。
  • 配達員が道の途中で長時間止まっていたため、配達時間が遅くなったのか疑問に思う。
  • 配達員の動機は分からないが、時間に余裕を持って配達してほしいという希望を伝えたい。
回答を見る