gpt4 book ai didi

c++ - 从内存缓冲区初始化 C++ std::istringstream?

转载 作者:IT老高 更新时间:2023-10-28 21:34:52 26 4
gpt4 key购买 nike

我有一个内存块(不透明),我想通过他们的 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);

这是正确的方法吗?

最佳答案

编写一个一次性的 std::streambuf 实际上很简单,它使用适当的缓冲区作为 std::streambuf 的所有虚函数的默认行为> 做“正确的事”。你可以在构造中只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();
}

关于c++ - 从内存缓冲区初始化 C++ std::istringstream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com