C++ストリームをマスター:cout、cin、cerr、clogの実践ガイド
C++におけるストリームとは
C++は、データをバイトシーケンスとして転送するストリームクラスのファミリを通じて入出力を抽象化します。これらのストリームは、言語におけるすべてのI/O操作の基盤です。
ストリームは2つのカテゴリに分類されます:
ストリームの種類
- 入力ストリーム – キーボードやファイルなどのデバイスからデータを受け取り、メモリに配置
- 出力ストリーム – メモリからモニターやファイルなどのデバイスへデータを送信
このチュートリアルでは以下を扱います:
- ストリームの基礎
- ストリームの内部動作
- 主要なストリームクラスとその機能
- C++ I/O用ヘッダファイル
- std::cout、std::cin、std::cerr、std::clogの使用
- ストリームオブジェクトによるエラー処理
ストリームの動作原理
典型的なC++ストリーム操作の流れ:
- 適切なタイプのストリームオブジェクトをインスタンス化
- get/putポインタを使用してストリームをデバイスやファイルに関連付け
- 抽出(>>)または挿入(<<)演算子でI/Oを実行
ストリーム関数の概要
streambufヘッダはファイルバッファを管理するいくつかのクラスを提供します:
| クラス | 説明 |
|---|---|
| filebuf | 読み書き用ファイルバッファを管理。open()とclose()を提供 |
| fstreambase | ifstream、fstream、ofstreamの基底 – 共通ファイルストリーム操作 |
| ifstream | データ読み込み用の入力ファイルストリーム |
| ofstream | データ書き込み用の出力ファイルストリーム |
| fstream | 入出力両用の結合ストリーム |
C++ I/O用ヘッダファイル
- iostream –
cin、cout、cerr、clogを提供 - iomanip –
setw、setprecisionなどのマニピュレータを提供 - fstream – ファイルベースのストリームを処理
これらのオブジェクトはすべてiostreamで定義されており、このヘッダを省略するとコンパイルエラーになります。
std::cout
coutオブジェクトは標準出力ストリーム(通常はコンソール)に書き込みます。挿入演算子(<<)と共に使用します。
例
#include <iostream>
using namespace std;
int main() {
char welcome[] = "Welcome to Guru99";
cout << welcome << endl;
return 0;
}
出力:
コードウォークスルー:
iostreamをインクルードしてcoutにアクセス- プレフィックスを避けるため
std名前空間を使用 - メッセージを保持する文字配列を定義
endlで改行を挿入しながらメッセージを出力- 成功を示す
0を返却
std::cin
cinオブジェクトは標準入力ストリーム(通常はキーボード)から読み取ります。抽出演算子(>>)と組み合わせます。
例
#include <iostream>
using namespace std;
int main() {
int number;
cout << "Enter a number:";
cin >> number;
cout << "\nYou entered: " << number;
return 0;
}
出力:
コード解説:
iostreamをインクルードしてcinとcoutにアクセスstd名前空間を使用- 整数変数を宣言
- ユーザーにプロンプト
>>で入力を読み取り- 入力値をエコー出力
- 成功時に
0を返却
std::cerr
cerrストリームは非バッファードであるため、エラーメッセージを即座に出力します。即座に表示しなければならない重大なエラーに使用します。
例
#include <iostream>
using namespace std;
int main() {
cerr << "An Error occurred!";
return 0;
}
出力:
解説:
iostreamをインクルードしてcerrにアクセスstd名前空間を使用- エラーメッセージを即座に出力
0を返却
std::clog
cerrとは異なり、clogはバッファードであり、バッファがフラッシュされるまでメッセージを蓄積します。遅延可能なログ記録に有用です。
例
#include <iostream>
using namespace std;
int main() {
clog << "An Error occurred!";
return 0;
}
出力:
解説:
iostreamをインクルードしてclogにアクセスstd名前空間を使用- バッファードエラーメッセージを書き込み
0を返却
ストリームオブジェクトによるエラー処理
ストリームはブールコンテキストで評価して有効性をチェックできます。また、メンバ関数で詳細なステータスチェックが可能です:
good() – エラーが発生していない場合truebad() – 致命的なエラーが設定されている場合truefail() – 失敗した操作の後にtrueeof() – ストリームの末尾に達した場合true
例 – ファイルオープンの検証:
ifstream file("myfile.txt");
if (!file) {
cout << "File NOT opened!" << endl;
}
例 – ユーザー入力の検証:
int p;
if (cin >> p) {
cout << "Enter valid number" << endl;
}
まとめ
- C++ではI/Oはバイトシーケンスを転送するストリームを通じて実行される
- 入力ストリームはデバイスからメモリへ、出力ストリームはメモリからデバイスへデータを移動
cin(istream)はキーボード入力を読み取りcout(ostream)はコンソールに書き込みcerr(ostream)は即座にエラーメッセージを表示clog(ostream)はエラー出力をバッファし後でフラッシュ- バッファードストリームは
good()、bad()、fail()、eof()でチェック可能
C言語
- C# 入出力の基礎:ユーザー入力と出力の基本をマスター
- C++入出力完全ガイド:cin/coutの基本から複数入力まで
- C言語入出力(I/O)マスター:scanf()とprintf()徹底解説
- C++ switch文をマスター:構文、使い方、実践例
- C++例外処理をマスター:try、catch、throwの実践例
- C++動的配列の確保をマスター:コード例付き実践ガイド
- C++構造体を実例で徹底解説
- C言語の入出力マスター:標準関数とファイル操作
- C++の核心構文とオブジェクト指向の基礎を理解する
- Dラッチ完全マスター:設計、動作原理、フリップフロップとの違い
- Java入出力をマスター:表示、読み取り、データフォーマット