両方の関数を使用してコンソールに出力できることを知っています。私はその質問
を読みましたが、コンソールに出力するときにどちらを使用するのが好ましいかは誰にもわかりませんでした。では、どちらの機能が優れているのか、大きな違いはありますか?
3 に答える
標準(n1570では7.21.6.3)を引用するには:
この関数は、への引数の前に引数を挿入した
printf
場合と同等です。fprintf
stdout
printf
したがってprintf
、コンソールに印刷する場合は便利です。それ以外の場合は、違いはありません。ただしfprintf
、出力ターゲットを変更する場合は、変更が少し簡単です。
各プロセスには、名前付きの入力ストリームstdin
と 2 つの出力ストリームがstdout
ありstderr
ます。これらの出力ストリームはどちらも端末に接続されているため、次のコマンドはすべて「hello」という行を端末に出力します。
printf("hello\n");
fprintf(stdout, "hello\n");
fprintf(stderr, "hello\n");
最初の 2 つはまったく同じですが、最初のほうが短くて便利です。最初のものは最も一般的に使用されます。
3 つ目は、 に送信されるコンテンツが に送信されるコンテンツとstderr
は論理的に分離されているという点で異なりstdout
ます。通常、ユーザーに表示するエラー メッセージに使用されます。ライブラリ関数perror
は、エラー メッセージを に出力しますstderr
。
ストリームが論理的に分離されていることの重要性はstderr
、そのコンテンツを から分離できることstdout
です。たとえば、コマンドを使用しls -l
てファイルを一覧表示するとします。
$ touch myfile
$ ls -l myfile
-rw-r--r-- 1 wrm staff 0 6 Nov 20:44 myfile
の出力を別のファイルにリダイレクトするとls
、次のようになります。
$ ls -l myfile > otherfile
$
がプロセスのストリームを に>
リダイレクトしたため、出力は表示されません。以下を見ると、リダイレクトされた出力を確認できます。stdout
ls
otherfile
otherfile
$ cat otherfile
-rw-r--r-- 1 wrm staff 0 6 Nov 20:44 myfile
$
しかし、ストリーム>
はリダイレクトされませんでした。リダイレクトされたコマンドを削除して再実行することで、stderr
それをテストできます。myfile
ls -l
$ rm myfile
$ ls -l myfile > otherfile
ls: myfile: No such file or directory
$
ここでは、 にリダイレクトされたものの、stdout
リダイレクトさotherfile
れstderr
なかったため、そのコンテンツが端末に表示されたことがわかります。また、コマンドが見つからず、 に送信するものがなかっotherfile
たため、 は空になっていることに注意してください。ls
myfile
stdout
をリダイレクトすることもできstderr
ますが、それがどのように行われるかは、シェル (端末を制御するプログラム) によって異なります。
特定の出力ストリームに印刷する必要がある場合は、fprintfを使用してください。
エラーメッセージを表示する必要がある場合は、fprintf w/stderrを使用してください
コマンドライン実行可能ファイルを開発していて、ユーザーに何かを表示したいだけの場合は、printfを使用してください。