std::cerrとstd::clogを扱う
cerrストリームとclogストリームを使って、診断情報やログをプログラムの出力から分離します。
「std::cerrとstd::clogを扱う」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
3 つの出力ストリーム
標準ライブラリには、あらかじめ定義された 3 つの出力ストリームがあります。
- std::cout — バッファー付き標準出力
- std::cerr — バッファーなし標準エラー出力
- std::clog — バッファー付き標準エラー出力
std::cerr:エラーと警告
std::cerr は stderr に書き込み、バッファリングされません。そのため、直後にプログラムがクラッシュしても、出力はすぐに表示されます。
std::cerr << "Error: file not found\n";std::clog:バッファリングされたログ
std::clog も stderr に書き込みますが、cout と同様にバッファリングされます。多少の遅延が問題にならない通常のログに使用してください。
std::clog << "[info] processing record 42\n";なぜ stderr には2つのストリームがあるのか
エラーは、クラッシュする前にユーザーが確認できるよう、すぐに表示する必要があります。ログは大量になるため、バッファリングして性能を許容範囲に保ちます。
出力のリダイレクト
コマンドラインでは、stdout と stderr は別々のチャネルに送られます。それぞれを個別にリダイレクトしてください。
# Send stdout to a file, stderr to the terminal
./app > out.txt
# Send stderr to a file too
./app 2> err.txt
# Send both to one file
./app > all.txt 2>&1診断出力とデータ出力
慣例として、機械可読なデータは stdout に、人間向けの診断情報は stderr に出力します。これにより、パイプラインを適切に機能させられます。
ストリームを連結する
cin はデフォルトで cout に結び付けられています。cin から読み取ると、先に cout がフラッシュされます。cerr も同様に cout に結び付けられています。
レベル付きカスタムロギング
clog をヘルパー関数でラップし、INFO、WARN、ERROR などのログレベルを設けてください。これにより、ログメッセージを一貫させられます。
void warn(const std::string& msg) {
std::clog << "[WARN] " << msg << "\n";
}
void error(const std::string& msg) {
std::cerr << "[ERROR] " << msg << "\n";
}パフォーマンス:cerr は遅い
cerr は操作のたびにフラッシュするため、繰り返し書き込むと遅くなります。大量のログには clog または専用のロギングライブラリを使用してください。
clog を手動でフラッシュする
デバッグのために clog の出力をすぐ表示したい場合は、手動でフラッシュしてください。
std::clog << "checkpoint" << std::flush;ファイルストリームへの書き込み
同じパターンをファイルストリームにも使用できます。std::ofstream でログファイルを開き、clog と同じようにストリームへ書き込んでください。
std::ofstream logFile("app.log");
logFile << "Application started\n";理解度チェック
書き込みのたびに自動的にフラッシュされる標準ストリームはどれですか?
まとめ
通常の出力には std::cout、緊急性の高いバッファリングされないエラーには std::cerr、バッファリングされるログには std::clog を使用します。シェルでは > と 2> を使って、それぞれを個別にリダイレクトしてください。
よくある質問
「std::cerrとstd::clogを扱う」レッスンは無料ですか?
はい。「std::cerrとstd::clogを扱う」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「std::cerrとstd::clogを扱う」で何を学びますか?
cerrストリームとclogストリームを使って、診断情報やログをプログラムの出力から分離します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「std::cerrとstd::clogを扱う」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- std::cinとstd::coutの適切な使い方
- iomanipによる出力の書式設定
- getlineで安全に入力を読み取る
- std::cerrとstd::clogを扱う