web-dev-qa-db-ja.com

「cer」と「stderr」とは何ですか?

それらの違いは何ですか、どのように使用されますか?誰かが例を教えてくれますか?

具体的には、両方のケースでどのようにストリームに「書き込む」のか、また、書き込まれたテキストをどのように回復して出力する(つまり、画面に出力する)のですか?

また、「画面」出力自体がストリームですよね?ストリームを十分に理解していないのかもしれません。もちろん、これはファイルに保存することもできます。これらはすべてfprintf/fscanfなどを使用しますか?

31
Russel

cerrはC++ストリーム、stderrはCファイルハンドルです。どちらも標準エラー出力を表します。

他のストリームやファイルハンドルに書き込むのと同じ方法でそれらに書き込みます。

cerr << "Urk!\n";
fprintf (stderr, "Urk!\n");

このコンテキストでの「回復」の意味がわかりません。出力は標準エラーになり、それだけです。プログラムはその後、それを気にするつもりはありません。プログラムの外部から後で保存する方法を意味する場合は、次の段落を参照してください。

デフォルトでは、それらは端末に行きますが、出力は次のようなもので他の場所にリダイレクトできます:

run_my_prog 2>error.out

そして、はい、「画面」出力はストリーム(またはファイルハンドル)ですが、それは通常、デフォルトでstdout/coutstderr/cerrが「画面」に接続されているためです。画面に何も書き込まれない次の場合のように、リダイレクトはこれに影響します。

run_my_prog >/dev/null 2>&1

(それにもかかわらず、/dev/ttyに直接書き込むような厄介なこと)。このスニペットは、標準出力と標準エラーの両方をリダイレクトして、ビットバケットに移動します。

42
paxdiablo

それらの違いは何ですか

stderrFILE*、および標準Cライブラリの一部。 cerrostreamであり、標準C++ライブラリの一部です。

また、「画面」出力自体がストリームですよね?

はい、そうです。しかし、実際には、デフォルトで画面に書き込むtwoストリームがあります:stdout/coutは通常の出力用で、stderr/cerrはエラーメッセージ用です。これはリダイレクトに便利です。stdoutをファイルにリダイレクトできますが、画面にはエラーメッセージが表示されます。

7
dan04