【发布时间】:2013-12-30 15:31:28
【问题描述】:
我正在尝试使用 Boost Spirit 库编写一个基本的 OBJ 文件加载器。虽然我使用标准的 std::ifstreams 让它工作,但我想知道是否可以使用内存映射文件对整个文件执行短语解析,因为它似乎提供了 here 发布的最佳性能。
我有以下代码,它似乎运行良好,但是当文件中有注释时它会中断。所以,我的问题是如何使用 Spririt 忽略 OBJ 文件中以“#”开头的注释?
struct vertex {
double x, y, z;
};
BOOST_FUSION_ADAPT_STRUCT(
vertex,
(double, x)
(double, y)
(double, z)
)
std::vector<vertex> b_vertices
boost::iostreams::mapped_file mmap(
path,
boost::iostreams::mapped_file::readonly);
const char* f = mmap.const_data();
const char* l = f + mmap.size();
using namespace boost::spirit::qi;
bool ok = phrase_parse(f,l,(("v" >> double_ >> double_ >> double_) |
("vn" >> double_ >> double_>> double_)) % eol ,
blank, b_vertices);
当没有 cmets 或除顶点/法线以外的任何其他数据时,上述代码运行良好。但是,当有不同类型的数据时,解析器会失败(因为它应该),我想知道是否有办法让它工作而无需重新解析每一行,因为它更慢(在我的测试中几乎是 2.5 倍) .谢谢!
【问题讨论】:
标签: c++ parsing boost boost-spirit-qi wavefront