## 6.1 標準入出力ストリームとは

標準 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 にも欠点があります。それは型の安全性の低さや、ユーザー定義クラスの一貫性における信頼性の低さなどです。以下の節では、これらの点について詳細を説明します。

### 6.1.1 型の安全性

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*)` を呼び出します。したがって、標準入出力ストリームの型の安全性が維持されます。

### 6.1.2 新しい型への拡張性

標準入出力ストリームのもう 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 月