Posted on 2011-01-13 13:17
逐渐 阅读(537)
评论(0) 编辑 收藏 引用
下面介绍如何从配置文件中读参数,配置文件中采用name = value的形式,#行表示注释.
1 #include <boost/program_options.hpp>
2
3 #include <vector>
4 #include <iostream>
5 #include <string>
6 #include <algorithm>
7 #include <iterator>
8 #include <fstream>
9 using std::copy;
10 using std::vector;
11 using std::string;
12 using std::cout;
13 using std::cerr;
14 using std::endl;
15 using std::exception;
16 using std::ostream;
17 using std::ifstream;
18 using std::ostream_iterator;
19
20 namespace po=boost::program_options;
21
22 // output vector.
23 template <typename T>
24 ostream& operator<<(ostream& os, const vector<T>& v)
25 {
26 copy(v.begin(), v.end(), ostream_iterator<T>(os, " "));
27 return os;
28 }
29
30 int main(int argc, char*argv[])
31 {
32 try
33 {
34 string conf_file;
35 po::options_description desc("general descriptions.");
36 desc.add_options()
37 ("help", "generate help information")
38 ("config,c", po::value<string>(&conf_file)->default_value("compiler.conf"), "compiler configure file")
39 ("input-file", po::value<vector<string> >(), "input files")
40 ("link-file,l", po::value<vector<string> >()->composing(), "link file");
41
42 po::positional_options_description p;
43 p.add("input-file", -1);
44
45 po::variables_map vm;
46 //po::store(po::parse_command_line(argc, argv, desc), vm);
47 po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
48 po::notify(vm);
49
50
51 if(vm.count("help"))
52 {
53 cout<<desc<<endl;
54 return 1;
55 }
56
57 // add following lines
58 ifstream i_conf(conf_file.c_str());
59 if(!i_conf)
60 {
61 cerr<<"Configure file not exit.\n";
62 return -1;
63 }
64 else
65 {
66 po::store(po::parse_config_file(i_conf, desc), vm);
67 notify(vm);
68 }
69
70 if(vm.count("input-file"))
71 {
72 cout<<"Input files: "<<vm["input-file"].as<vector<string> >()
73 <<"\n";
74 }
75
76 if(vm.count("link-file"))
77 {
78 cout<<"Link file: "<<vm["link-file"].as<vector<string> >()
79 <<"\n";
80 }
81 }
82 catch(exception& e)
83 {
84 cout<<e.what()<<endl;
85 return -1;
86 }
87
88 return 0;
89 }
90
第38行添加了config参数命令,接受一个string类型值,并将默认值设为compiler.conf.
第40行添加了composing()方法,这表示程序将从不同的数据源中获得数据并组合起来.
第66行解析配置文件并存储至vm.
接下来代码便是比对vm中选项值,简单吧:)
boost文档里介绍了隐藏选项和存放多姐选项的方法,
http://www.boost.org/doc/libs/1_45_0/doc/html/program_options/tutorial.html#id2073299