IOS.INTRO(3CC4)

名前
ios.intro - 入出力ストリームとマニュアルページについて

形式

#include <iostream.h>
class stream_MT ;
class streambuf : public stream_MT ;
class unsafe_ios ;
class ios : virtual public unsafe_ios, public stream_MT ;
class unsafe_istream : virtual public unsafe_ios ;
class istream : virtual public ios, public unsafe_istream ;
class unsafe_ostream : virtual public unsafe_ios ;
class ostream : virtual public ios, public unsafe_ostream ;
class unsafe_iostream : public unsafe_istream, public unsafe_ostream ;
class iostream : public istream, public ostream ;
class istream_withassign : public istream ;
class ostream_withassign : public ostream ;
class iostream_withassign : public iostream ;

class Iostream_init ;

extern istream_withassign cin ;
extern ostream_withassign cout ;
extern ostream_withassign cerr ;
extern ostream_withassign clog ;

#include <fstream.h>
class filebuf : public streambuf ;
class unsafe_fstreambase : virtual public unsafe_ios ;
class fstreambase : virtual public ios, public unsafe_fstreambase ;
class fstream : public fstreambase, public iostream ;
class ifstream : public fstreambase, public istream ;
class ofstream : public fstreambase, public ostream ;

#include <strstream.h>
class strstreambuf : public streambuf ;
class unsafe_strstreambase : public virtual unsafe_ios ;
class strstreambase : public virtual ios, public unsafe_strstreambase ;
class istrstream : public strstreambase, public istream ;
class ostrstream : public strstreambase, public ostream ;
class strstream : public strstreambase, public iostream ;

#include <stdiostream.h>
class stdiobuf : public streambuf ;
class stdiostream : public ios ;

機能説明
これらのマニュアルページは、C++ のストリーム入出力を構成する 個々の関数およびクラスの詳細を理解するための参考資料です。 基本的な内容を説明するチュートリアルは別に用意されています。 ここで使用している「ストリーム」という用語は、 C の stdio ファイル (これも「ストリーム」と呼ばれる)、 または UNIX System V のストリームとは無関係です。

iostream パッケージは、libthread ライブラリのもとで 同時に稼働する複数のスレッドで iostream オブジェクトを 共有するための拡張が行われました。 現在、iostream のほとんどのクラスは unsafe (マルチスレッド環境で使用できない) と safe (マルチスレッド環境で使用しても安全) の 2 つの形式で定義されています。 unsafe バージョンは、 複数のスレッドによる同時アクセスから保護されません。 一方の safe バージョンは、mutex ロックを使用することで 複数のスレッドによる同時アクセスから各オブジェクトを保護します。 ただし、クラス streambuf とクラス filebuf は例外です。 これらのクラスのオブジェクトには、 関連するすべてのメンバー関数にロックされたバージョンと ロックされていないバージョンの両方が用意されています。 ロックされていないバージョンは、 関数名の後ろに ``_unlocked'' という接尾辞を付ける ことで区別されます。

safe バージョンの関数を使用しても、 マルチスレッド環境においてアプリケーションが 適切に動作するとは限りません。 詳細については、 『C++ ライブラリ・リファレンス』の 4 章「マルチスレッド環境での従来型の iostream ライブラリの使用」 を参照してください。

  背景

Bjarne Stroustrup 氏著「プログラミング言語 C++」 で紹介されている C++ ストリーム入出力は、 C++ コンパイラの初期のリリースで登場しました。 通常、「入出力ストリーム」 (iostream) と呼ばれる新しいストリーム入出力は、 C++ のリリース ``2.0'' から登場しています。 オリジナルのストリーム入出力と比べ、 入出力ストリームは C++ 言語の機能 (特に、C++ の初期のバージョンには なかった新しい言語機能) を効果的に使用しています。 基本的なストリーム入出力機能は、新旧どちらのストリームでも同じです。 入出力ストリームには、 旧バージョンから新バージョンへの移行を 容易にするための後方互換機能がいくつか組み込まれています。 入出力ストリームの最新のリリースでは、 言語仕様の変化に伴う変更がさらに加えられています。 この変更は、2 つのカテゴリに分けられます。 1 つは char 型の変更、もう 1 つはネストした型に関する規則の変更です。

C++ の初期の実装には文字型に 2 種類しかありませんでしたが、 現在の C++ の char 型には「プレーンな」 char、 signed char、 unsigned char の 3 種類があります。 入出力ストリームの初期のバージョンでは、 各関数に符号つきの「プレーンな」 char を引数にとるバージョンと、 unsigned char をとるバージョンがありました。 これらの関数 のほとんどは文字および文字型の配列しか処理しないため、 現在そのような関数には、「プレーンな」 char をとるバージョンしかありません。

C++ の初期のバージョンでは、クラス内部で定義された型は クラス外部で定義された関数のように扱うという C の規則を使用していました。 現在、C++ では、クラス内で定義された型はすべてそのクラスでローカルであり、 外部のクラス修飾子でしか参照できないという規則になっています。 この規則により、入出力ストリームのいくつかの点に影響が出ています。 たとえば、クラス ios の内部で定義された列挙型名を修飾する必要があります。 すなわち、 io_state または seek_dir の代わりに、 ios::io_state または ios::seek_dir を使用しなければなりません。

マニュアルページでは、 入出力ストリームを使用して 移植可能なプログラムを書くために必要な公開インタフェースと 限定公開インタフェースを説明しています。 ただし、具体的な実装方法は示していません。 この実装方法は非公開であり、 移植可能なプログラムでは依存すべきではないためです。

  基本的なクラス

入出力ストリームは基本的にクラス階層の集まりです。 基本的なクラスは以下のとおりです。

unsafe_ios
    このクラスは、エラー状態変数、書式化状態変数など、 各種ストリームクラスに共通な状態変数を含んでいます。 このクラスは、複数のスレッドによるアクセスから保護されません。 ios(3CC4) を参照。

ios クラス ios はすべてのクラスの仮想基底クラスです。 このクラスは書式化情報とステータス情報を保持します。 詳細については、 ios(3CC4) で説明します。mutex ロックを使用することで、 複数のスレッドによる同時アクセスから保護されます。 ios(3CC4) を参照。

streambuf
    クラス streambuf は、すべてのストリームバッファの仮想基底クラスです。 このクラスは、バッファリングと 「挿入」 (格納出力) および「抽出」 (フェッチまたは入力) のための 基本機能を定義します。 各非仮想メンバー関数には、2 つのバージョンが定義されています。 1 つはロックされていないバージョンで、 複数のスレッドによる同時アクセスから保護されません。 もう 1 つは、デフォルトのロックされたバージョンで、 MT-safe です。 ロックされていないバージョンでは、 関数名の後ろに接尾辞 "_unlocked" が付きます。 プログラミング入出力に使用される このクラスの公開インタフェースは sbufpub(3CC4) で説明します。 使用可能なバッファクラスを派生させるときに必要な 限定公開インタフェースについては、 sbufprot(3CC4) で説明します。

unsafe_istream
    このクラスは、 streambuf からフェッチされた文字の列からの書式つきおよび書式なしの変換を サポートします。 このクラスは、 複数のスレッドによる同時アクセスから保護されません。 istream(3CC4) を参照。

istream
    クラス istream は、対応する streambuf 上で 書式つきおよび書式なしの入力操作を行います。 このクラスの詳細については、 istream(3CC4) で説明します。

unsafe_ostream
    このクラスは、 streambuf に格納されている文字の列への書式つきおよび書式なしの変換を サポートします。 このクラスは、複数のスレッドによる同時アクセスから保護されていません。 ostream(3CC4) 参照。

ostream
    クラス ostream は、対応する streambuf 上で書式つきおよび書式なしの出力操作を行います。 このクラスの詳細については、 ostream(3CC4) で説明します。

iostream
    クラス iostream は、 istream と ostream の機能を組み合わせたものです。 iostream は、単一の双方向ストリーム上で入力と出力の両方を行います。

istream_withassign
    ostream_withassign
    iostream_withassign
    クラス istream_withassign、ostream_withassign、iostream_withassign は、それぞれの対応するクラスである istream、ostream、iostream に代入演算子を追加したものです。 定義済みのストリーム cin 、 cout 、 cerr 、 clog (後述) はこれらのクラス型のオブジェクトで、 技術的な理由から代入演算子が必要です。

  派生バッファクラス

特定のストリームに対応するバッファクラスは、 文字のフェッチまたは格納の方法を定義します。 sbufprot(3CC4) で説明しているように、 streambuf から独自のバッファクラスを派生させることができます。 定義済みのバッファクラスには以下の 3 つがあります。

filebuf
    このバッファクラスは、 低レベルのファイル記述子を使用したファイル入出力を行います。 C の標準入出力は使用しません。 メンバー関数により、ファイルのオープン、クローズ、 シーク操作をサポートします。 filebuf との間で入出力を行うとき、 バッファクラスは必要に応じて対応するファイルとの間で 読み取りまたは書き込みを行います。 各非仮想メンバー関数には、2 つのバージョンが定義されています。 1 つはロックされていないバージョンで、 複数のスレッドによる同時アクセスから保護されません。 もう 1 つは、デフォルトのロックされたバージョンで、 MT-safe です。 ロックされていないバージョンには、 関数名の後ろに接尾辞 "_unlocked" が付きます。 このクラスの詳細については、 filebuf(3CC4) で説明します。

stdiobuf
    このバッファクラスは、C 標準入出力の FILE 構造体を使用した入出力を行います。 この形式を用いると、入出力の効率が filesbuf を使用した場合と比べてかなり低下します。 同じファイルとの間の入出力で入出力ストリームと C の標準入出力の両方を 使用しなければならないときは、ストリームバッファクラスとして stdiobuf を使用してください。 それ以外の場合は、 filebuf を使用します。 このクラスの詳細については、 stdiobuf(3CC4) で説明します。

strstreambuf
    このクラスは、ストリームと文字配列との間で書式つきおよび書式なしの メモリー転送を行います。 各非仮想メンバー関数には、2 つのバージョンが定義されています。 1 つはロックされていないバージョンで、 複数のスレッドによる同時アクセスから保護されません。 もう 1 つは、デフォルトのロックされたバージョンで、 MT-safe です。 ロックされていないバージョンには、 関数名の後ろに接尾辞 "_unlocked" が付きます。 このクラスの詳細については、 ssbuf(3CC4) で説明します。

  派生ストリームクラス

通常、ストリームクラスの定義は、 istream、ostream、iostream のうちの 1 つから派生させたり、 専門化されたバッファクラスによって定義します。 以下に示す定義済みストリームクラスにより、 共通な条件のほとんどが満たされます。

ifstream
    ofstream
    fstream
    この 3 つのクラスは、 対応するバッファクラスとして filebuf を使用してファイル入出力を行います。 各クラスは順に、入力、出力、入出力の両方に使用します。 これらのクラスは mutex ロックを使用することで 複数のスレッドによる同時アクセスから保護されます。 詳細については、 fstream(3CC4) で説明します。

istrstream
    ostrstream
    strstream
    この 3 つのクラスは、 対応するバッファクラスとして strstreambuf を使用して メモリー内の文字配列による入出力を行います。 各クラスは順に、入力、出力、入出力の両方に使用します。 これらのクラスは mutex ロックを使用することで 複数のスレッドによる同時アクセスから保護されます。 詳細については、 strstream(3CC4) で説明します。

stdiostream
    このクラスは、対応するバッファクラスとして stdiobuf を使用します。 前述のように、 fstream を使用した場合、または filebuf を使用した他のストリームと比べ、効率がかなり低下します。 stdiostream を使用する唯一の理由は、 入出力ストリームのコードと C 標準入出力のコードの両方から 同じファイルへの入出力が可能になるためです。 このクラスの詳細については、 stdiobuf(3CC4) で説明します。

  定義済みストリーム

従来から C と C++ のプログラムは入出力のために 3 つの 定義済みファイル (標準入力、標準出力、標準エラー) を使用します。 プログラムに <iostream.h> を取り込むと、 以下の 4 つの定義済み入出力ストリームが利用可能になります。

cin 標準入力 (ファイル記述子 0) に接続されます。

cout
    標準出力 (ファイル記述子 1) に接続されます。

cerr
    標準エラー (ファイル記述子 2) に接続されます。 cerr に書き込まれる文字は 挿入操作が終わるたびにフラッシュされます。 このようなバッファリングを 「単位バッファリング」 と呼んでいます。

clog
    標準エラー (ファイル記述子 2) に接続されます。 このストリームはデフォルトでは完全にバッファリングされます。 これが、 cerr と唯一異なる点です。

ストリーム cin、cerr、clog は cout に結合 されます。 すなわち、 cin から抽出を行う前、 または cerr または clog に挿入を行う前に cout がフラッシュされます。 定義済みストリームは、デフォルトでは mutex ロックを使用することで 複数のスレッドによる同時アクセスから保護されます。 クラス stream_MT で定義されているメンバー関数 set_safe_flag を呼び出せば この保護を無効にできます。

  ヘッダファイル

<iostream.h>
    定義済みストリームの使用など、入出力ストリームの基本機能を定義します。

<fstream.h>
    <iostream.h> を取り込み、同時にクラス filebuf と fstream を定義します。

<strstream.h>
    <iostream.h> を取り込み、同時にクラス strstreambuf と strstream を定義します。

<stdiostream.h>
    <iostream.h> を取り込み、同時にクラス stdiobuf と stdiostream を定義します。

<manip.h>
    標準のマニピュレータ の一部を定義します。 マニピュレータについては、 manip(3CC4) とチュートリアルで説明します。

関連項目
filebuf(3CC4)、 fstream(3CC4)、 ios(3CC4)、 istream(3CC4)、 manip(3CC4)、 ostream(3CC4)、 sbufprot(3CC4)、 sbufpub(3CC4)、 ssbuf(3CC4)、 stdiobuf(3CC4)、 strstream(3CC4)、 stream_locker(3CC4)、 stream_MT(3CC4)、 『C++ ライブラリ・リファレンス』の第 3 章「iostream ライブラリ」 および第 4 章「マルチスレッド環境での従来型の iostream ライブラリの使用」