我在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;
Run Code Online (Sandbox Code Playgroud)
重要条件:不得以任何方式复制或更改数据(否则我只使用字符串流.据我所知,不能在不复制数据的情况下从const char指针创建字符串流. )
Die*_*ühl 38
这样做的方法是创建一个合适的流缓冲区.例如,这可以这样做:
#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)) {
}
};
Run Code Online (Sandbox Code Playgroud)
唯一有点尴尬的是const_cast<char*>()在流缓冲区中:流缓冲区不会改变数据但是仍然需要char*使用接口,主要是为了更容易在"普通"流缓冲区中更改缓冲区.有了这个,您可以imemstream用作普通输入流:
imemstream in(data, size);
in >> value;
Run Code Online (Sandbox Code Playgroud)