ユーザー定義された構造体のデータを埋めるために、ブーストスピリット2で、文字列の解析

StackOverflow https://stackoverflow.com/questions/2469861

質問

私は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_ % ',');

あなたが期待する正確に何をやるべきか。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top