我在一个缓冲区中有一些由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 标准库流类非常混乱且设计不佳。我认为这是不值得的,除非您需要扩展很多。