본문 바로가기

프로그래밍/boost

boost::program_options 사용

첫 예제를 따라 쳐봤다 -_-

boost::program_options 사용이다.

책에서는 부스트 버전 1_53_0인데, 난 1_63_0이다. 그래도 문제 없이 잘 했음.


예제를 따라치면서 주의 사항이 있었음 -_-

1. "oranges,o" 부분 , 뒤에 공백 있으면 안됨...

   ("oranges,o", opt::value<int>(), "how many oranges do you have") 이 부분 따라칠때, 모르고 습관적으로 공백 넣었다가 에러 만났음.

2. 파일을 미리 생성해서 값을 입력해놔야 함. 책에서 정확하게 파일을 꼭 만드시오! 부분이 없어서 그냥 코드만 치고 실행 했다가 에러 만났음.

   실행파일이 있는 폴더에 config.ini 파일을 생성해야 한다.

3. 책 예제에는 parse_config_file 에 바로 실행될 텍스트 파일의 이름을 적는데, 없으면 이셉션 날린다 -_- ifstream으로 하면 이셉션은 안난다...











 desc.add_options() 함수 사용한거 보면 짱 신기하다

.이나 -> 등 없이 계속 () 안에다가 입력만 하면 되는데... 신기해서 헤더파일 들어가봤더니, 다 operator() 해놨더군. 깔끔하다



그리고 코드에서 보면 parse 관련 함수가 2개 있다! 커맨드라인이랑 컨피그파일 읽어오는 부분

opt::store(opt::parse_command_line(argc, argv, desc), vm);

opt::store(opt::parse_config_file<char>(ini_file, desc, true), vm);



명령 실행창에 인자값 모두 입력하면 parse_command_line에서 입력한 vm값이 나오고

입력 안하면 config 값 읽어서 저장된 값 불러온다.

vm에는 순서대로 입력되는거 같다. 두개 실행 순서 바꿔주면 커맨드라인 입력해도 config값 뿌려준다.



opt::store 함수는 parse 해서 나온 값을 vm에 저장해준다.

notify 는 뭐하는놈인지 모르겠음.


vm.count 함수는, 커맨드라인에 입력 했을때 해당하는 옵션키가 들어왔는지 체크해준다.

예를 들어서 >실행파일.exe --help 라고 입력하면

1 = vm.count("help"); 값은 1 반환 된다.





와 ㅡ ㅡ 책에 딱 사용 할 수 있게 코드만 쭈르륵 적어놓고

각 함수마다 뭐하는놈인지 설명 1도 없다

ㅋㅋㅋ - - 한줄한줄 다 찾아봤네

졸라 친절하게 마지막줄에 링크 하나 줬더라. 저기서 찾아보라고 ㅗㅗㅗㅗ 나쁜놈들

http://www.boost.org/doc/libs/1_53_0/doc/html/program_options.html




복붙이 필요하신분들을 위해 코드 남겨 놓겠음



#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <boost/program_options.hpp>
#include <boost/program_options/errors.hpp>

namespace opt = boost::program_options;

int main(int argc, char* argv[])
{
 opt::options_description desc("all options");
 desc.add_options()
  ("apples,a", opt::value<int>()->default_value(10), "how many apples do you have")
  ("oranges,o", opt::value<int>(), "how many oranges do you have")
  ("name", opt::value<std::string>(), "your name")
  ("help", "produce help message");

 opt::variables_map vm;
 opt::store(opt::parse_command_line(argc, argv, desc), vm);
 opt::notify(vm);

 if (vm.count("help")) {
  std::cout << desc << "\n";
  return 1;
 }

 try {
  std::ifstream ini_file("config.ini");
  opt::store(opt::parse_config_file<char>(ini_file, desc, true), vm);
  std::cout << "try" << "\n";
 }
 catch (const opt::reading_file& e)
 {
  std::cout << "Failed to open configuration file 'config.ini':" << e.what();
 }

 opt::notify(vm);

 if (vm.count("name")) {
  std::cout << "Hi," << vm["name"].as<std::string>() << "\n";
 }

 std::cout << "Fruits count: " << vm["apples"].as<int>() + vm["oranges"].as<int>() << "\n";

    return 0;
}




책 제목 - > 부스트라이브러리예제로배우는 boost c++ 애플리케이션 개발

'프로그래밍 > boost' 카테고리의 다른 글

boost::variant  (0) 2017.02.17
boost::any  (0) 2017.02.17
boost 책 질렀다!  (0) 2017.02.16