2005年02月21日

C++の入出力関連クラス

C++の標準ライブラリには入出力関連のクラスが含まれています。 例えばファイルに出力するためのクラスはofstreamです。

といってもofstreamは本物のクラスというわけではなく、
typedef basic_ofstream<char, char_traits<char> > ofstream;

と定義されていますので、basic_ofstreamテンプレートクラスがcharに特化された型となっています。

特化された型についてまで説明するとややこしくなるので、以下basic_から始まるクラスについてのみ説明します。

basic_ofstream周辺のクラス構成

basic_ofstreamに関連したクラスの構成は、以下のようになっています。

部分クラス図

basic_ostreamというクラスが出力関連クラスの基底クラスになっているようです。
そしてここにwriteという出力用関数があります。 私は、最初このwriteが出力用の中核となる関数だと思っていました。
Javaで言えばjava.io.OutputStreamクラスのwrite、MFCで言えばCFileクラスのWrite、どちらも出力用の中核となる関数です。
ところが、このbasic_ostreamのwriteは、virtual関数では無いのです。 virtualでは無いということは、派生クラスで処理内容を変えられないということです。
basic_ofstreamは、どうやってファイルにデータを出力しているのでしょうか?
basic_ostringstreamは、どうやってメモリにデータを出力しているのでしょうか?
そこらへんに疑問を持ちましたので、ちょっと調べてみました。

入出力関連クラス構成

入出力関連クラスの構成は結局こんな感じになっているようです。

全体クラス図

でもってvirtualなwrite関数も見つけました。 basic_streambufクラスのxputnとxgetnです。 どうやらこれらの関数こそが入出力処理の中核になっているようです。

basic_ostreamやbasic_istreamから派生したクラスは、どうもbasic_streambufのラッパでしかないようです。Javaで言えば、ObjectOutput/InputStreamに相当するクラスみたいです。
basic_streambufから派生したbasic_filebufやbasic_stringbufが真の(?)入出力処理を行うクラスのようですね。

basic_streambufよ・・・お前が犯人か・・・

投稿者 MASATO : 2005年02月21日 00:12 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?