メモリバッファ内からC ++のはstd :: istringstreamを初期化?
質問
私は自分の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で実際にコードや速度の最小のオーバーヘッドと正確に何をしたいん。これは、ハーブサッターする
他のヒント
それは正しいこと」をしstd::streambuf
のすべての仮想関数のデフォルトの動作として、所定の位置にバッファを使用してワンショットstd::streambuf
を書くために実際には非常に簡単です。あなただけの最初の取得領域の終わりがストリームの終わりであるような構成とsetg
とunderflow
における読み出し領域が安全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を持っています。