从常数内存创建输入流

Creating an input stream from constant memory

本文关键字:输入流 创建 内存 常数      更新时间:2023-10-16

我在一个缓冲区中有一些由const char*指针指向的数据。数据只是ASCII字符串。我知道它的大小。我希望能够以相同的方式读取数据。我正在寻找一个可以让我编写这样的代码的解决方案:

// for example, data points to a string "42 3.14 blah"
MemoryStreamWrapper in(data, data_size);
int x;
float y;
std::string w;
in >> x >> y >> w;

重要条件:必须以任何方式复制或更改数据 (否则我只使用字符串流。据我的最大知识,不可能创建一个字符串流从const char指针中,无需复制数据。)

这样做的方法是创建合适的流缓冲区。可以这样做,例如:

#include <streambuf>
#include <istream>
struct membuf: std::streambuf {
    membuf(char const* base, size_t size) {
        char* p(const_cast<char*>(base));
        this->setg(p, p, p + size);
    }
};
struct imemstream: virtual membuf, std::istream {
    imemstream(char const* base, size_t size)
        : membuf(base, size)
        , std::istream(static_cast<std::streambuf*>(this)) {
    }
};

唯一有些尴尬的事情是流缓冲区中的const_cast<char*>():流缓冲区不会更改数据,但是接口仍然需要使用char*,主要是为了使更容易更改"正常"流式缓冲区中的缓冲区。因此,您可以将imemstream用作普通输入流:

imemstream in(data, size);
in >> value;

唯一的方法是sub -class std :: istream(也需要子分类std :: streambuf)创建自己的流类,该类从常数内存读取。

听起来并不容易,因为C 标准库流类非常混乱且设计不佳。我认为这是不值得的,除非您需要扩展很多。