標準 C++ ライブラリには、データストリームの入出力のためのクラスが組み込まれています。現在の ANSI/ISO 規格では、ほとんどの C++ コンパイラには、入出力ストリームライブラリとして知られる、クラスライブラリが組み込まれています。このマニュアルでは、ANSI/ISO 標準 C++ ライブラリを構成する標準入出力ストリームに対して、このライブラリのことを在来型入出力ストリームと呼びます。アーキテクチャー全体と使用頻度の最も高いインタフェースが維持されていることから、標準入出力ストリームは、在来型入出力ストリームとある程度互換性があります。第 24 章では、非互換性を詳しく説明します。
標準入出力ストリームは、在来型 C++ 入出力ストリームライブラリと対比できるだけでなく、標準 C ライブラリの入出力とも対比することができます。C プログラマの多くは、C ライブラリの入出力機能である C stdio を好んで使用することがあります。これは、C ライブラリに慣れているため、C++ 入出力ストリームではなく、C stdio を使用するという理由もあります。たとえば、C stdio の C 関数 printf() と scanf() の呼び出しは、一般により簡潔です。しかし、C stdio にも欠点があります。それは型の安全性の低さや、ユーザー定義クラスの一貫性における信頼性の低さなどです。以下の節では、これらの点について詳細を説明します。
stdio 関数に対する呼び出しと標準入出力ストリームとを比較します。stdio 呼び出しでは、次のように読み取りを行います。
int i = 25; char name[50] = "Janakiraman"; fprintf(stdout, "%d %s", i, name);
正しい出力は次のとおりです。 25 Janakiraman.
ここで、引数を偶発的に fprintf に変更するとどういった結果になるでしょうか。実行するまでエラーを検出することができず、またおかしな文字が出力されるのか、システムクラッシュするのかも予想できません。しかし、標準入出力ストリームでは、こういった問題は発生しません。
cout << i << ' ' << name << '\n';
シフト演算子 operator<<() のオーバーロードバージョンがあるため、必ず正しい演算子が呼び出されます。関数 cout << i は operator<<(int) を呼び出し、cout << name は operator<<(const char*) を呼び出します。したがって、標準入出力ストリームの型の安全性が維持されます。
標準入出力ストリームのもう 1 つの利点は、ユーザー定義の型をシーケンスに適用できることです。たとえば、型 Pair を出力することを考えてみます。
struct Pair { int x; string y; }
この新しい型 Pair に operator<<() をオーバーロードするだけで行うことができます。次のように対を出力することができます
Pair p(5, "May"); cout << p;
対応する operator<<() は、次のように実装することができます。
basic_ostream<char>& operator<<(basic_ostream<char>& o, const Pair& p) { return o << p.x << ' ' << p.y; }
Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月