16

C++ アダプターを介して mySQL の Blob に格納したいメモリ ブロック (不透明) があります。アダプターは istream を予期します。

virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;

したがって、私の質問は、このメモリ ブロック (char* として入力) から std::istream を作成するにはどうすればよいかということです。null で終了していないため、文字列ではありません (もちろん、その長さはわかっています)。

たとえば std::string にメモリ ブロックをコピーせずにそれを行う方法を見つけることができませんでした。これはちょっともったいないと思います。このようなものは機能しません:

    std::streambuf istringbuf(blockPtr, blockLength);
    std::istringstream tmp_blob(&istringbuf);

std::streambuf にはそのようなコンストラクタがないためです。次の提案を見ました。

    std:: istringstream       tmp_blob;
    tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);

それは正しい方法ですか?

4

4 に答える 4

48

std::streambufのすべての仮想関数のデフォルトの動作std::streambufが「正しいこと」を行うため、バッファを使用するワンショットを書くのは実際にはかなり簡単です。最初の get 領域の最後がストリームの最後であるためsetg、構築中の読み取り領域だけunderflowuflow安全に残すことができます。traits_type::eof()

例えば:

#include <streambuf>
#include <iostream>
#include <istream>
#include <ostream>

struct OneShotReadBuf : public std::streambuf
{
    OneShotReadBuf(char* s, std::size_t n)
    {
        setg(s, s, s + n);
    }
};

char hw[] = "Hello, World!\n";

int main()
{
    // In this case disregard the null terminator
    OneShotReadBuf osrb(hw, sizeof hw - 1);
    std::istream istr(&osrb);

    istr >> std::cout.rdbuf();
}
于 2009-09-19T21:08:19.457 に答える
9

std::istrstream を見てください。コンストラクターがあります

 istrstream( char* pch, int nLength );

このクラスは減価償却されているか、少なくとも通常は他のクラスを使用するように言われています。
strstream の問題は、char* バッファのメモリを管理するのがより複雑であるため、一般的にはメモリ管理を行う stringstream を好むことです。ただし、この場合、すでに char* のメモリを管理しているため、この場合の通常の利点はコストです。実際、この場合、 strstream は、コードまたは速度のオーバーヘッドを最小限に抑えて、必要なことを正確に実行します。これは、Herb Sutter による ostrsteramの議論に似ています。

于 2009-09-19T12:39:14.790 に答える
5

Boost.IOStreamsには、文字列ストリームのように機能するストリームがありますが、ネイティブ配列をラップするため、データをコピーする必要がありません。

std::stringstreamは常に独自の内部バッファを作成します

于 2009-09-19T12:47:44.147 に答える
-1

テストされていませんが、おそらくテストする価値があります...

std::stringstream ss;
ss.write( blockPtr, blockLength );
ss.seekg(0);

次に、その setBlob 関数を ss で呼び出します。ただし、jalf が既に述べたように、std::stringstream にはまだその内部バッファーがあります。

于 2009-09-19T18:45:43.963 に答える