Boost Spirit ライブラリを使用して、基本的な OBJ ファイル ローダーを作成しようとしています。私は標準の std::ifstreams を使用して動作させましたが、ここに投稿されているように最高のパフォーマンスを提供するように見えるため、メモリ マップされたファイルを使用してファイル全体でphrase_parseを実行できるかどうか疑問に思っています。
私は次のコードを持っています。これはうまくいくようですが、ファイルにコメントがあると壊れます。それで、私の質問は、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);
上記のコードは、コメントや頂点/法線以外のデータがない場合にうまく機能します。しかし、異なるタイプのデータがある場合、パーサーは(本来あるべきように)失敗し、すべての行の解析に戻らずに動作させる方法があるかどうか疑問に思っています(私のテストではほぼ2.5倍)。 . ありがとうございました!