ユーザー定義された構造体のデータを埋めるために、ブーストスピリット2で、文字列の解析
-
20-09-2019 - |
質問
私はVS2005でのブースト-1.42.0と一緒に配布されたBoost.Spiritを使用しています。私の問題は、このようなものです。
私はカンマでdelimtedたこの文字列をしました。それの最初の3つのフィールドは、文字列と残ります番号です。このようなています。
String1,String2,String3,12.0,12.1,13.0,13.1,12.4
私のルールはこのようなものです。
qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;
私はこのような構造にデータを格納しようとしています。
struct MyStruct
{
vector<string> stringVector ;
vector<double> doubleVector ;
} ;
MyStruct var ;
私は精神でそれを使用するためにBOOST_FUSION_ADAPT_STRUCTUREに包みました。
BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))
私のparse関数は、ラインを解析し、trueを返すと
後qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;
私はvar.stringVectorとvar.doubleVectorが適切に満たされている期待しています。それはそうではありません。
何が間違って行くのですか?
のサンプルコードが配置されているこちら
事前のおかげで、 スーリヤ
解決
qi::skip_type
は、あなたが船長を使用することができますものではありません。チー:: skip_typeのみqi::skip
ディレクティブに適用され、プレースホルダskip[]
のタイプ、(lexeme[]
内部スキップ有効または使用中のスキッパーを変更する)、かつそれ自体で任意の入力に一致するパーサーコンポーネントではないです。あなたは(boost::spirit::ascii:space_type
だ、あなたのケースで)代わりに、特定のスキッパータイプを指定する必要があります。
また、あなたのルールが解析された属性を返すようにするために、あなたはあなたのルールを定義しながら、予想される属性の型を指定する必要があります。それはであなたを残します:
qi::rule<string::iterator, std::string(), ascii:space_type>
stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type>
myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');
あなたが期待する正確に何をやるべきか。
所属していません StackOverflow