ページ 11

バッファから作成できるストリームについて

Posted: 2007年10月31日(水) 19:09
by GPGA
お世話になります。

C++のストリームについての質問です。
JavaのByteArrayInputStreamのような、バッファを対象とするストリームはありますでしょうか?

やりたいこととしては、あるリソースを管理するクラスがあり、そのクラスはファイルからの読み込みとバッファからの読み込みに対応しています。
簡単にですが、やっていることを説明するクラスを以下に記載します。
class CResource
{
public :
    SetFile(const char* szFileName) {
        std::ifstream ifs(szFileName, std::ios::in | std::ios::binary);
        std::istream is(ifs.rdbuf());
        int size;   // サイズ

        // 必要な箇所にストリームのポインタをセットする
        ・・・

        ReadData(is, size);
    }

    SetMemory(const char* lpcBuffer) {
        // std::ifstream ifs(szFileName, std::ios::in | std::ios::binary);  ←★ここにバッファからストリームを作成するクラス
        std::istream is(ifs.rdbuf());
        int size;   // サイズ

        // 必要な箇所にストリームのポインタをセットする
        ・・・

        ReadData(is, size);
    }

private :
    void ReadData(std::istream& is, int size) {
        buf.resize(size);
        is.read(&buf[0], size);
    }

private :
    std::vector<char> buf;
};
 
★に該当するクラスはありますでしょうか?
宜しくお願いいたします。

Re:バッファから作成できるストリームについて

Posted: 2007年10月31日(水) 19:22
by たかぎ
std::istrstream は試してみましたか?
一応非推奨扱いにはなっていますが、実はかなり便利なクラスだったりします。

Re:バッファから作成できるストリームについて

Posted: 2007年10月31日(水) 19:41
by GPGA
ご返信ありがとうございます。

先ほど記載を忘れましたが、環境は OS:Windows XP、処理系:VS2005を使用しています。

istringstreamは試してみましたが、コンストラクタでバッファを渡したときに
バッファに0があると、そこでデータを切り取られてしまうため、画像やサウンドなどのデータを扱う場合、不可能と判断しました。

#include <iostream>
#include <sstream>

int main() 
{ 
    char buf[4] = { 0 };
    char buf2[/url] = { 3, 2, 0, 1, };
    std::istringstream iss(buf2);
    std::istream is(iss.rdbuf());   

    is.read(buf, 4);

    for (int i = 0; i < 4; ++i) {
        std::cout << "buf[" << i << "] = " << (int)buf << std::endl;
    }
    return 0;
}

[結果]
buf[0] = 3
buf[1] = 2
buf[2] = 0
buf[3] = 0
 
istringstreamに替わるクラスもしくは、istringstreamクラスで0終端でデータを切らない方法などはありますでしょうか?

Re:バッファから作成できるストリームについて

Posted: 2007年10月31日(水) 19:56
by GPGA
追記

std::istringstream iss(buf2);
↓
std::istringstream iss(buf2, std::ios::in | std::ios::binary);

に変更して試してみましたが、結果に変化はありませんでした。
 

Re:バッファから作成できるストリームについて

Posted: 2007年10月31日(水) 23:33
by たかぎ
istringstream ではなく istrstream です。
コンストラクタでサイズを指定してやれば、ナル文字は考慮されなかった気がするのですが...

Re:バッファから作成できるストリームについて

Posted: 2007年11月01日(木) 10:58
by GPGA
> istringstream ではなく istrstream です。
大変失礼しました。
勝手にistringstreamに脳内変換していました。

istrstreamを使用することで、望む動作を得ることができました。
ありがとうございました。