提升精神是否适合这种情况
Is boost spirit a good fit for this situation?
我遇到过一种情况,我试图从名称-值对流中构建HDF复合类型(为了简单起见,我们会说值可以是双精度或字符串)。需要明确的是,数字数据已经是二进制的 - 它不是一个字符串。名称提供结构信息(这是数组的一部分吗?,这是嵌套复合类型的一部分吗?)。
我正在想象制作一个标记向量,使用名称信息插入标记(例如"["和"]"分隔数组,"{"和"}"分隔嵌套化合物),但否则使用值。 从文档中我不清楚 Spirit 二进制解析器是否是处理数值的合适选择。
我无法判断"其余的"(即非二进制数据)是否证明使用 PEG 解析器生成器是合理的。
但是,只是为了给您一些开始的东西:
用
-
qi::bin_float
、qi::little_bin_float
或qi::big_bin_float
-
qi::bin_double
、qi::little_bin_double
或qi::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";
}
在科里鲁现场观看
使用的命令:
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 如何处理二进制输入。
相关文章:
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在这种情况下,java对象是否可以调用本机函数
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 是否可以在没有真实文件的情况下创建 ifstream
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 是否可以在不扣除的情况下将模板参数转发到 make_*?
- C++ 移动语义是否在任何情况下都能节省资源?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- C++箭头运算符 (->) 是否在所有情况下都返回左值?
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- 在这种情况下,当尝试从单独的类更新变量时,我是否需要使用指针?
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在不复制的情况下访问undered_map中的元素
- 当通过常量和不是字符串的最佳选择时,是否有任何情况?