为了账号安全,请及时绑定邮箱和手机立即绑定

从常量内存创建输入流

从常量内存创建输入流

C++
墨色风雨 2019-10-31 13:02:22
我在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指针创建字符串流。 )
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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


#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;


查看完整回答
反对 回复 2019-10-31
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


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


查看完整回答
反对 回复 2019-10-31
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-10-31
  • 3 回答
  • 0 关注
  • 357 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信