从常量内存创建输入流

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


墨色风雨
浏览 372回答 3
3回答

炎炎设计

这样做的方法是创建一个合适的流缓冲区。例如,可以这样做:#include <streambuf>#include <istream>struct membuf: std::streambuf {&nbsp; &nbsp; membuf(char const* base, size_t size) {&nbsp; &nbsp; &nbsp; &nbsp; char* p(const_cast<char*>(base));&nbsp; &nbsp; &nbsp; &nbsp; this->setg(p, p, p + size);&nbsp; &nbsp; }};struct imemstream: virtual membuf, std::istream {&nbsp; &nbsp; imemstream(char const* base, size_t size)&nbsp; &nbsp; &nbsp; &nbsp; : membuf(base, size)&nbsp; &nbsp; &nbsp; &nbsp; , std::istream(static_cast<std::streambuf*>(this)) {&nbsp; &nbsp; }};唯一有点尴尬的是const_cast<char*>()流缓冲区中的内容:流缓冲区不会更改数据,但仍需要char*使用该接口,主要是为了更轻松地更改“常规”流缓冲区中的缓冲区。这样,您可以将其imemstream用作普通输入流:imemstream in(data, size);in >> value;

阿波罗的战车

唯一的方法是将std :: istream子类化(这也需要将std :: streambuf子类化)以创建自己的从常量内存读取的流类。这并不像听起来那样容易,因为C ++标准库流类非常混乱且设计不良。除非您需要大量扩展,否则我认为这不值得。

慕虎7371278

上周,我了解到我们目前的目标是C ++ 2014!也就是说,需要在4月份提交完整的建议书,准备将其提交工作文件-尽管这是一个很小且实际上有用的功能,但我认为这种情况不会发生。一个绊脚石是,每当为IOStreams提出任何建议时,都会有一个主要的抱怨:“我们能不能有更好的东西?” 但没有人提出更好的建议……
打开App,查看更多内容
随时随地看视频慕课网APP