从常量内存创建输入流

时间:2012-10-24 22:55:26

标签: c++ input stream

我在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指针而不复制数据。)

2 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分:0)

唯一的方法是子类std :: istream(它还需要子类化std :: streambuf)来创建自己的流类,从常量内存中读取。

它并不像听起来那么容易,因为C ++标准库流类非常混乱且设计糟糕。我不认为这是值得的,除非你需要它扩展很多。