次のようなプログラムを、./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")
}
No.2ベストアンサー
- 回答日時:
・ 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の機能と密接なつながりがあります。
No.3
- 回答日時:
stdout = スタンダードアウト
stderr = スタンダードエラー
因みに、 stdio = スタンダードI/O、 stdlib = スタンダードライブラリ
エラー表示が見えなくなったらデバッグが面倒です。
因みに昔ディスプレイが無い時代はプリンタで”表示”
されていましたが、stdoutやstderr はプリンタがデフォルト
だったんでしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
flush()とclose()について
-
system.out.printが出力されない
-
StringBufferで改ページ処理を...
-
JAVAのServletで、画像表示につ...
-
javaにおけるCSV出力時の文字コ...
-
サーブレットのログ出力先
-
数字文字列をパック10進数に変...
-
javaのwhile文で九九の表
-
ジャバスクリプトについて。
-
getName()で取得したファイル名...
-
Tomcatが無応答となる現象が起...
-
Javaの文字コード変換方法
-
行列の表示
-
toString()メソッドについて
-
文字の順番を昇順に
-
ループ処理の際、最後だけ","を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
1~100までの数字を表示したい
-
StringBufferで改ページ処理を...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
javaにおけるCSV出力時の文字コ...
-
テキストエリアで改行する
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
一定のスペースを空けて端を揃...
-
JAVAのServletで、画像表示につ...
-
バイトスワップ
-
InputStreamはreadが1回しかで...
おすすめ情報