gpt4 book ai didi

c++ - boost spirit 适合这种情况吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:01 24 4
gpt4 key购买 nike

我有这样一种情况,我试图从名称-值对流中构建一个 HDF 复合类型(为简单起见,我们假设一个值可以是 double 型或字符型字符串)。需要明确的是,数字数据已经是二进制的——它不是字符串。名称提供结构信息(这是数组的一部分吗?这是嵌套复合类型的一部分吗?)。

我想制作一个标记 vector ,使用名称信息插入标记(例如,“[”和“]”分隔数组,“{”和“}”分隔嵌套化合物),否则使用值(value)。从文档中我不清楚 Spirit 二进制解析器是否是处理数值的合适选择。

最佳答案

我无法判断“其余”(即非二进制数据)是否有理由使用 PEG 解析器生成器。

但是,只是给你一些开始的东西:

使用

  • qi::bin_floatqi::little_bin_floatqi::big_bin_float
  • qi::bin_doubleqi::little_bin_doubleqi::big_bin_double

这是一个 17 行的示例程序,它完全复制了

od -w8 -A none -t f8 -v input.dat

在我的盒子上:

#include <boost/spirit/include/qi.hpp>
#include <fstream>
#include <iomanip>

namespace qi = boost::spirit::qi;

int main() {
using namespace std;
// read file
ifstream ifs("input.dat", ios::binary);
string const input { istreambuf_iterator<char>(ifs), {} };

// parse
vector<double> result;
bool ret = qi::parse(begin(input), end(input), *qi::bin_double, result);

// print
if (ret) for (auto v : result)
cout << setw(28) << setprecision(16) << right << v << "\n";
}

查看 Live on Coliru


使用的命令:

clang++ -Os -std=c++11 -Wall -pedantic main.cpp          # compile
dd if=/dev/urandom count=32 bs=1 2>/dev/null > input.dat # generate input
./a.out # spirit demo
echo 'And `od` output:'
od -w8 -A none -t f8 -v /tmp/input.dat # compare to `od`

免责声明这只是为了帮助您了解 Spirit 如何处理二进制输入。

关于c++ - boost spirit 适合这种情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com