我有一个内存块(不透明),我想通过自己的C ++适配器在MySQL中的Blob存储。 该适配器需要一个istream的:
virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;
所以我的问题是:如何可以从这个内存块(类型为char *)创建一个std :: istream的。 这不是一个字符串,因为它是不是空终止(但我知道它的路线的长度)。
我无法找到一个方法来做到这一点没有为std :: string复制我的记忆区块为例。 我认为这是一个有点浪费。 像这样的东西不起作用:
std::streambuf istringbuf(blockPtr, blockLength);
std::istringstream tmp_blob(&istringbuf);
因为性病::流缓冲可是没有这样的构造。 我看到了以下建议。
std:: istringstream tmp_blob;
tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);
那是正确的方法是什么?
看的std :: istrstream它有一个构造函数
istrstream( char* pch, int nLength );
这个类是有点贬值或至少你通常告知使用其他类。
与strstream的问题是,它是更为复杂的管理的char *缓冲区的内存所以一般因为它的内存管理你,你宁愿stringstream的。 然而,在这种情况下,你已经管理的char *的内存,使正常的好处就是在这种情况下成本。 事实上,在这种情况下,strstream正是你想要什么呢,在代码或速度最小的开销。 这是类似的讨论ostrsteram由Herb萨特
这其实很琐碎写一个一次性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有像一个字符串流流,但包装原生数组,所以你无需复制数据。
的std :: stringstream的总是创建自己的内部缓冲区
未经测试,但也许值得一试...
std::stringstream ss;
ss.write( blockPtr, blockLength );
ss.seekg(0);
然后调用与SS该功能的setBlob。 你仍然有性病:: stringstream的内部缓冲区jalf虽然已经提到。