- ベストアンサー
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") }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
・ C言語の初心者にとって、stderrとstdoutを理解することは基本的であり重要なことです。 1. fprintf(stderr,"output1\n"); 2. fprintf(stdout,"output2\n"); 3. printf("output3\n") ここで、3.は、2.の省略形であると考えてください。 そこで、1.と2.について簡単に述べてみます。 おそらくなんとなくでも理解できていると思われますが、両者とも直接に「コンソール」やファイルに書き込んでいるわけではありません。あくまでも出力先はstderrでありstdoutであるわけです。このことを再確認することがポイントです。Cのプログラミングで指定してるのがこの「抽象的」とも言えるstderrとstdoutです。 こうすることによって、実行するときに実際の出力先を指定できることになります。つまり、実行開始時に たとえばstdoutを「ファイル」と結びつけて走らせます。この例が ./a.out>out.txtです。 この場合、リダイレクトと言いますがstdoutとout.txtを結び付けているわけです。その結果「コンソール」には表示されません。つまり、2.と3.は何も表示されません。 そして、この結びつきを指定せずに実行するのをデフォルトといいますが、このとき使われるのが「コンソール」であるわけです。この実行方法が ./a.out のみです。この場合、2.と3.は「コンソール」に表示します。 (*)もうお気づきかと思いますが、前者・後者が実行結果が間違っていますね。 最後に、stderrについてですが、これはstdoutと違い、普通のリダイレクト(>)では結びつきを替えません。つまり、「コンソール」のままです。その結果 stderrは常に「コンソール」に出力します。したがって ./a.out>out.txt を実行した場合も stderrだけは、1.の文により「コンソール」への出力となりこれだけが表示されます。 プログラムで直接に具体的なものにしておくと実行時に変更できないわけですが、このように「抽象的」な物を入れてワンクッション置いておくと柔軟性が増すわけです。なおこれは、LinuxやMS-DOS(コマンドプロンプト)等のOSの機能と密接なつながりがあります。
その他の回答 (2)
- bushclean
- ベストアンサー率26% (6/23)
stdout = スタンダードアウト stderr = スタンダードエラー 因みに、 stdio = スタンダードI/O、 stdlib = スタンダードライブラリ エラー表示が見えなくなったらデバッグが面倒です。 因みに昔ディスプレイが無い時代はプリンタで”表示” されていましたが、stdoutやstderr はプリンタがデフォルト だったんでしょうね。
- koko_u_
- ベストアンサー率18% (459/2509)
>のようになりましたが、なぜこうなるか理由がわかりません。 逆じゃないの? まずはシェルのマニュアルで、リダイレクトの項目を読みましょう。
補足
すいません逆かもしれなかったです。家のパソコンでは確認できないのですが・・・
お礼
とても詳しくありがとうございました。