両方の関数を使用してコンソールに出力できることを知っています。私はその質問
を読みましたが、コンソールに出力するときにどちらを使用するのが好ましいかは誰にもわかりませんでした。では、どちらの機能が優れているのか、大きな違いはありますか?
3 に答える
標準(n1570では7.21.6.3)を引用するには:
この関数は、への引数の前に引数を挿入した
printf場合と同等です。fprintfstdoutprintf
したがって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
$
がプロセスのストリームを に>リダイレクトしたため、出力は表示されません。以下を見ると、リダイレクトされた出力を確認できます。stdoutlsotherfileotherfile
$ cat otherfile
-rw-r--r-- 1 wrm staff 0 6 Nov 20:44 myfile
$
しかし、ストリーム>はリダイレクトされませんでした。リダイレクトされたコマンドを削除して再実行することで、stderrそれをテストできます。myfilels -l
$ rm myfile
$ ls -l myfile > otherfile
ls: myfile: No such file or directory
$
ここでは、 にリダイレクトされたものの、stdoutリダイレクトさotherfileれstderrなかったため、そのコンテンツが端末に表示されたことがわかります。また、コマンドが見つからず、 に送信するものがなかっotherfileたため、 は空になっていることに注意してください。lsmyfilestdout
をリダイレクトすることもできstderrますが、それがどのように行われるかは、シェル (端末を制御するプログラム) によって異なります。
特定の出力ストリームに印刷する必要がある場合は、fprintfを使用してください。
エラーメッセージを表示する必要がある場合は、fprintf w/stderrを使用してください
コマンドライン実行可能ファイルを開発していて、ユーザーに何かを表示したいだけの場合は、printfを使用してください。