前のページ次のページ上に戻るホーム SophiaFramework 2.1

6.5. メモリ ストリーム

SFUMemoryStream は、メモリ バッファに対する入出力を実装しています。 ストリーム バッファとして内部で SFUMemoryBuffer を使用しています。

Void TestMemory() {
    SFUMemoryStream mstr(0);
    mstr << endianbig;
    mstr >> endianbig;

    for (UInt32 i = 0; i < 4; i++) {
        mstr << i;
        if (mstr.Exception() != NO_ERROR) {
            TRACE("write error!");
        }
    }

    while (! mstr.IsEOS()) {
        UInt32 n;
        mstr >> n;
        TRACE("%d", n);
    }
}

この例では初期バッファ サイズ 0 でメモリ ストリームを構築しています。 メモリ ストリームにデータを書き込むと、 バッファは自動的に拡大していきます。

次のように、Attach()/Detach() 関数によって既存のバッファに対する 入出力を行うこともできます。 この場合は、ストリームにバッファ サイズを超えて書き込みを行うとエラーになり、 Exception() に SFUStreamBuffer::MEMFULL_ERROR が設定されます。

UInt08 data[256];
buf.Attach(data, sizeof(data));
SFUStream mstr(buf);
   ... mstr によるストリーム処理 ...
buf.Detach();

メモリ ストリームに対して endianbig マニピュレータを使用することで、 数値データの入出力におけるエンディアン変換を自動的に行うことができます。 上記の例ではメモリ上にビッグエンディアンとして書き込み、 メモリ上のデータがビッグエンディアンであると仮定して読み取ります。

データの書き込みと読み取りはインサータ (<<) とエクストラクタ (>>) で行います。 書き込み時にエラーがあると、Exception() は NO_ERROR 以外の値を返します。 読み取り時にストリームの終端に達すると、IsEOS() が TRUE を返します。