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 指针创建字符串流。 )

4

2 回答 2

63

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

#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;
于 2012-10-24T23:05:34.303 回答
2

唯一的方法是对 std::istream 进行子类化(这也需要对 std::streambuf 进行子类化)以创建您自己的从常量内存读取的流类。

这并不像听起来那么容易,因为 C++ 标准库流类非常混乱且设计糟糕。除非您需要大量扩展,否则我认为这不值得。

于 2012-10-24T23:02:00.947 回答