2011-02-15 1 views
1

엔드 포인트 항목 목록을 포함하는 구성 파일이 있습니다. 각 항목은 [endpt/n] (n 번째 끝점)이라는 제목으로 레이블되며 MAC 및 IP 주소로 구성됩니다. boost :: program_options를 사용하여 주소를 문자열로 읽고 push_back을 두 벡터에 출력하고 싶습니다. 나는 program_options 문서를 검토 한 결과,하지만 난 여기에 엔드 포인트 항목의 예를 위해 ... 찾고있어 무엇을 찾을 수 없어 : 여기boost :: program_options 및 push_back을 std :: vector에 읽으시겠습니까?

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

내가 현재 사용하고 코드입니다 부스트 :: options_description 각 엔드 포인트의 MAC 및 IP 옵션을 추가합니다 :

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 주소,와 push_back 빈 벡터를 선언하고 싶습니다 부스트가 옵션을 읽습니다. 나는 Boost에 익숙하지 않기 때문에 목록을 읽는 더 좋은 방법에 대한 제안이나 다른 도움이 크게 감사 할 것입니다. 감사!

답변

1

원하는대로 정확히 수행하는 것이 간단합니다. 첫째, po::value<std::string> 대신 po::value< vector<std::string> >을 사용하십시오. 프로그램 옵션은 벡터를 특수하게 지원합니다. 그런 다음 두 벡터를 직접 참조하십시오.

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 번호가 벡터의 올바른 인덱스와 반드시 연결되는 것은 아니라는 점을 지적해야합니다.

+0

응답 해 주셔서 감사합니다. 여전히 문제가 있습니다 ... po :: value'를'po :: vector'로 대체하면'error : 'vector'는 'po'의 멤버가 아닙니다. (나는 OP에 그것을 포함시키지 않았지만'namespace po = boost :: program_options;') 이것을 사용하는 것이 버전 문제 일 수 있습니까? Boost 1.40을 사용하고 있습니다 ... – tpm1510

+0

아니요, 버전 문제가 아닙니다. 내 코드가 깨졌습니다. 나는 그것을 바로 잡았다. 또한'options_description'은 v.1.41.1에서도 첫 번째 매개 변수에 대해'std :: string'을 사용하지 않는다는 점이 흥미 롭습니다. – rcollyer

+0

@ tpm1510, 코드가 작동합니까? – rcollyer