プロが教えるわが家の防犯対策術!

次のようなプログラムを、./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")
}

A 回答 (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の機能と密接なつながりがあります。
    • good
    • 0
この回答へのお礼

とても詳しくありがとうございました。

お礼日時:2008/04/19 03:42

stdout = スタンダードアウト


stderr = スタンダードエラー

因みに、 stdio = スタンダードI/O、 stdlib = スタンダードライブラリ


エラー表示が見えなくなったらデバッグが面倒です。
因みに昔ディスプレイが無い時代はプリンタで”表示”
されていましたが、stdoutやstderr はプリンタがデフォルト
だったんでしょうね。
    • good
    • 0

>のようになりましたが、なぜこうなるか理由がわかりません。


逆じゃないの?

まずはシェルのマニュアルで、リダイレクトの項目を読みましょう。

この回答への補足

すいません逆かもしれなかったです。家のパソコンでは確認できないのですが・・・

補足日時:2008/04/18 03:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!