31

const char*ポインターが指すバッファーにいくつかのデータがあります。データは単なる ASCII 文字列です。私はその大きさを知っています。データがストリームから読み取られるのと同じ方法で読み取れるようにしたいと思います。次のようなコードを記述できるソリューションを探しています。

// for example, data points to a string "42 3.14 blah"
MemoryStreamWrapper in(data, data_size);
int x;
float y;
std::string w;
in >> x >> y >> w;

重要な条件:データをコピーしたり変更したりしてはなりません(それ以外の場合は、文字列ストリームを使用します。私の知る限り、データをコピーせずに const char ポインターから文字列ストリームを作成することはできません。 )

4

2 に答える 2

63

これを行う方法は、適切なストリーム バッファを作成することです。これは、たとえば次のように行うことができます。

#include <streambuf>
#include <istream>

struct membuf: std::streambuf {
    membuf(char const* base, size_t size) {
        char* p(const_cast<char*>(base));
        this->setg(p, p, p + size);
    }
};
struct imemstream: virtual membuf, std::istream {
    imemstream(char const* base, size_t size)
        : membuf(base, size)
        , std::istream(static_cast<std::streambuf*>(this)) {
    }
};

const_cast<char*>()ストリーム バッファはデータを変更しませんが、主に「通常の」ストリーム バッファのバッファを簡単に変更できるようにするために、インターフェースを使用する必要がありますchar*imemstreamこれにより、通常の入力ストリームとして使用できます。

imemstream in(data, size);
in >> value;
于 2012-10-24T23:05:34.303 に答える
2

唯一の方法は、std::istream をサブクラス化し (std::streambuf もサブクラス化する必要があります)、定数メモリから読み取る独自のストリーム クラスを作成することです。

C++ 標準ライブラリのストリーム クラスはかなり面倒で、設計も適切ではないため、思ったほど簡単ではありません。大規模なスケーリングが必要でない限り、価値があるとは思いません。

于 2012-10-24T23:02:00.947 に答える