マニュアルページ ios.intro.3
名前
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
ライブラリの使用」