メモリバッファ内からC ++のはstd :: istringstreamを初期化?

StackOverflow https://stackoverflow.com/questions/1448467

  •  11-09-2019
  •  | 
  •  

質問

私は自分のC ++アダプタを介してMySQLでBLOBに保存したいことを、メモリブロック(不透明な)を持っています。アダプターは、IStreamのを期待しています:

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

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

私はのstd ::文字列で、たとえば私のメモリブロックをコピーせずにそれを行うための方法を見つけることができませんでした。私は、これは少し無駄だと思います。このような何かが動作しません。

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

のstd :: streambufをdoesntのは、このようなコンストラクタを持っているので。私は、次の提案を見ています。

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

という正しい方法は何ですか?

役に立ちましたか?

解決

はstd ::を見、それはコンストラクタを持つistrstream

 istrstream( char* pch, int nLength );

このクラスは、ソートの減価償却されるか、少なくともあなたは、通常、他のクラスを使用するように指示されている。
strstreamの問題は、あなたのためのメモリ管理を行うようにあなたがにstringstreamを好む一般的になるのchar *バッファのメモリを管理するために、より複雑であるということです。通常の利点は、この場合にはコストですので、しかし、この場合、あなたはすでにのchar *のメモリを管理しています。この場合のstrstreamで実際にコードや速度の最小のオーバーヘッドと正確に何をしたいん。これは、ハーブサッターする

により、 ostrsteramの議論に似ています

他のヒント

それは正しいこと」をしstd::streambufのすべての仮想関数のデフォルトの動作として、所定の位置にバッファを使用してワンショットstd::streambufを書くために実際には非常に簡単です。あなただけの最初の取得領域の終わりがストリームの終わりであるような構成とsetgunderflowにおける読み出し領域が安全uflowを返すために残すことができ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();
}

Boost.IOStreamsがにstringstreamのように動作し、ストリームを持っていますが、データをコピーすることを避けるため、ネイティブ配列をラップします。

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

テストされていないが、おそらく価値はテスト...

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

次に、SSとのことのsetBlob関数を呼び出します。あなたのまだjalfは、すでに述べたようにかかわらず、その内部のstd ::のバッファにstringstreamを持っています。

scroll top