次のようなプログラムを、./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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- 英語 home where you've rented one out for a week? 4 2022/08/06 09:13
- MySQL MYSQL エラー 2 2022/10/18 11:37
- 英語 out front の品詞を教えてください。 You have the flowers out fr 3 2022/12/19 18:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
JavaScriptでcgiの戻り値を受け...
-
Javaで改行などが出来ないのです。
-
Log4jで機能毎に別ファイルへ出...
-
Tomcatが無応答となる現象が起...
-
flush()とclose()について
-
System.out.printlnの意味がよ...
-
java ファイル操作について
-
servlet のbackground
-
ジャバスクリプトについて。
-
ダブルクォーテーション(””)...
-
getName()で取得したファイル名...
-
Javaでの改行コード
-
[至急]Project Euler:#17Number...
-
1~100までの数字を表示したい
-
1~100までの数字を表示し、か...
-
JavaのSystem.setOut、System.s...
-
switch分が機能しません。
-
OutputStreamの内容を確認する...
-
system.out.printが出力されない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
-
Log4jで機能毎に別ファイルへ出...
-
1~100までの数字を表示したい
-
flush()とclose()について
-
System.out.printlnの出力先
-
ジャバスクリプトについて。
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
System.out.printlnの意味がよ...
-
一定のスペースを空けて端を揃...
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
javaのwhile文で九九の表
-
Javaの問題なのですが、 永久ル...
-
JavaScriptの変数をjavaのメソ...
-
StringBufferで改ページ処理を...
-
テキストエリアで改行する
-
tomcatのstdout.logを停止したい。
おすすめ情報