0

私は次のようなcfgファイルを持っています:

parameter1="hello"
parameter2=22
parameter3=12

すべてのパラメータを読み取るために使用boost_programすると、次のコードで正常に機能します。

po::options_description options("Options");
options.add_options()
  ("help,h", "produce help message")
  ("parameter1", po::value<string>(&parameter1)->default_value("bye"),
   "parameter1")
  ("parameter2", po::value<int>(&parameter2)->default_value(2),
   "parameter2")
  ("parameter3", po::value<int>(&parameter3)->default_value(4),
   "parameter3");


po::variables_map vm;
po::store(po::parse_command_line(argc, argv, options), vm);
notify(vm);

try
{
  po::store(po::parse_config_file< char >(filePath, options), vm);
}
catch (const std::exception& e)
{
  std::cerr << "Error parsing file: " << filePath << ": " << e.what() << std::endl;
}

..。

しかし、呼び出しから与えられた1つのパラメーターを読み取りたいだけのジェネリックメソッドを実行しようとすると、エラー解析が発生します。

たとえば、2番目のパラメータを読み取りたいので、次のように記述します。

const char parameter_string = "parameter2";
int default = 30;
int parameter;
getparameter(parameter_string,parameter,default);

そして、これが今回私が持っているものであるメソッドgetsparameterに行きます:..。

po::options_description options("Options");
options.add_options()
  ("help,h", "produce help message")
  (parameter_string, po::value<int>(&parameter)->default_value(default),
   "reading parameter");

 po::variables_map vm;
 po::store(po::parse_command_line(argc, argv, options), vm);
 notify(vm);

しかし、エラーは次のとおりです。

ファイルの解析エラー:file.cfg:不明なオプションparameter1

したがって、私の質問は、ファイルから1つのパラメーターのみを読み取ることが可能かどうか、または構成ファイルに書き込んだパラメーターと同じ数の行を含めてすべてのパラメーターを解析し、必要なパラメーターから値を取得する必要があるかどうかですboost_programoptions.add_option

4

2 に答える 2

2

関数を使用allow_unregisteredする:

未登録のオプションが許可され、渡される必要があることを指定します。オプションのように見えるが認識された名前を含まないトークンのようなコマンドごとに、basic_optionのインスタンスが結果に追加され、「unrecognized」フィールドが「true」に設定されます。'collect_unrecognized'関数を使用して、認識されないすべてのオプションを収集することができます。

于 2013-03-05T17:50:50.037 に答える
0

「parse_config_file」を使用しているため、ドキュメントで「allow_unregistered」がデフォルトで false に設定されていることがわかります。

template<typename charT> 
  BOOST_PROGRAM_OPTIONS_DECL basic_parsed_options< charT > 
  parse_config_file(std::basic_istream< charT > &, 
                const options_description &, 
                bool allow_unregistered = false);

だから私はこのように私の行を変更しました:

古いコード:

po::store(po::parse_config_file< char >(filePath, options), vm);

新しいコード:

po::store(po::parse_config_file< char >(filePath, options, true), vm);

そして、私が言ったように、それは機能します。ご回答ありがとうございます。

于 2013-03-06T09:15:02.270 に答える