zhujian

揣着梦想骑驴找马但不虐待驴
posts - 10, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Boost program_options(续)

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






只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理