1

エンドポイント エントリのリストを含む構成ファイルがあります。各エントリには [endpt/n] (n 番目のエンドポイント) という見出しが付いており、MAC アドレスと IP アドレスで構成されています。boost::program_options を使用してアドレスを文字列として読み取り、結果を 2 つのベクトルに push_back したいと思います。program_options のドキュメントを調べましたが、探しているものが見つかりませんでした... エンドポイント エントリの例を次に示します。

[endpt/2]
mac=ff-22-b6-33-91-3E
ip=133.22.32.222

各エンドポイントの MAC および IP オプションを boost::options_description に追加するために現在使用しているコードは次のとおりです。

std::vector<std::string> mac(NUM_ENDPTS);
std::vector<std::string>  ip(NUM_ENDPTS);

for(int e = 0; e < NUM_ENDPTS; e++)
{
    //convert endpoint 'e' to a string representing endpoint heading
    std::stringstream tmp;   tmp.clear();   tmp.str("");   tmp << e;
    std::string strEndpt = tmp.str();
    std::string heading = "endpt/"+strEndpt;

    cfig_file_options.add_options()
        ((heading+".mac").c_str(), po::value<std::string>(&mac[e]), ("ENDPT MAC")
        ((heading+".ip").c_str(),  po::value<std::string>( &ip[e]), ("ENDPT IP")
    ;
}

po::variables_map vm;
po::store(po::parse_config_file(config_stream, cfig_file_options), vm);
po::notify(vm);

このコードは問題なく動作しますが、いくつかの理由から、MAC アドレスと IP アドレスの空のベクトルを宣言し、boost がそれらを読み取るときにオプションをそれらに push_back したいと思います。私はBoostを初めて使用するので、リストを読むためのより良い方法に関する提案やその他の助けをいただければ幸いです. ありがとう!

4

1 に答える 1

1

あなたが望むように正確に行うのは簡単です。まず、プログラム オプションとしてpo::value< vector< std::string > >代わりに使用するpo::value< std::string >と、ベクターの特別なサポートが提供されます。次に、2 つのベクトルを次のように直接参照します。

typedef std::vector< std::string > vec_string;

cfig_file_options.add_options()
  ((heading+".mac").c_str(), po::value< vec_string >(&mac), "ENDPT MAC")
  ((heading+".ip").c_str(),  po::value< vec_string >( &ip), "ENDPT IP")
;

ここで重要なのは、すべての mac アドレスと ip アドレスがストレージに共通のベクトルを使用することです。ファイル内で厳密な順序が維持されていない限り、これは必ずしも ini ファイル内の endpt 番号をベクター内の正しいインデックスに関連付けるとは限らないことを指摘しておく必要があります。

于 2011-03-02T11:09:24.857 に答える