我在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指针而不复制数据。)
答案 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 ++标准库流类非常混乱且设计糟糕。我不认为这是值得的,除非你需要它扩展很多。