Rogue Wave バナー
前へマニュアルの先頭へ目次次へ

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

6.1.2 新しい型への拡張性

標準入出力ストリームのもう 1 つの利点は、ユーザー定義の型をシーケンスに適用できることです。たとえば、型 Pair を出力することを考えてみます。

struct Pair { int x; string y; }

この新しい型 Pairoperator<<() をオーバーロードするだけで行うことができます。次のように対を出力することができます

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 月