ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:ytmohimohi 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")
}
質問投稿日時:08/04/18 02:38
質問番号:3956217
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答10pt

回答者:bushclean stdout = スタンダードアウト
stderr = スタンダードエラー

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


エラー表示が見えなくなったらデバッグが面倒です。
因みに昔ディスプレイが無い時代はプリンタで”表示”
されていましたが、stdoutやstderr はプリンタがデフォルト
だったんでしょうね。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/04/19 02:36
回答番号:No.3
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答20pt

回答者:auty ・ 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の機能と密接なつながりがあります。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/04/18 03:39
回答番号:No.2
この回答へのお礼とても詳しくありがとうございました。

回答

 

回答者:koko_u_ >のようになりましたが、なぜこうなるか理由がわかりません。
逆じゃないの?

まずはシェルのマニュアルで、リダイレクトの項目を読みましょう。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/18 03:19
回答番号:No.1
この回答への補足すいません逆かもしれなかったです。家のパソコンでは確認できないのですが・・・
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示