创建从恒定存储器的输入流(Creating an input stream from constan

2019-06-18 15:31发布

我有一个缓存一些数据被指出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指针字符串流改变 。 )

Answer 1:

做到这一点的方法是创建一个合适的流缓冲区。 这可以,例如,就像这样:

#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;


Answer 2:

唯一的办法是子类的std :: istream的(这也需要子类的std ::流缓冲)来创建自己的流类,从常量内存中读取。

这不是因为它的声音,因为C ++标准库的流类是相当混乱和糟糕的设计一样简单。 我不认为这是值得的,除非你需要它扩展了很多。



文章来源: Creating an input stream from constant memory
标签: c++ input stream