从常数内存创建输入流
Creating an input stream from constant memory
我在一个缓冲区中有一些由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 标准库流类非常混乱且设计不佳。我认为这是不值得的,除非您需要扩展很多。
相关文章:
- 从C++中的数字输入动态创建矩阵
- 如何忽略输入流中的某些字符?
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 读取字符串文本输入以创建 2D 矢量
- 如何从输入文件 c++ 创建随机名称生成器
- 尝试使用来自 Win32 WASAPI C++的"捕获流"创建 wav 文件
- C++输入流.与 cin unget() 函数有点混淆
- 从输入流中读取行,并能够跳过块
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- c++用输入数据创建数组
- 处理输入流运算符>>中的无效输入
- 树莓派上的端口音频,找不到输入流的设备
- 如何将C++输入流分隔符包含在结果令牌中
- 如果两个输入流相等,我如何构造主()到输出是
- 使用非成员函数从输入流中提取类对象
- 基于输入变量创建JSON结构
- CIN是否将输入流中的无效字符取用
- 动态内存分配和输入(流)运算符C++
- 计算输入流中值的出现次数
- 从常数内存创建输入流