парсинг файла с помощью boost::program_options

176
26 ноября 2018, 11:50

есть конфиг файл вида

ip=192.168.1.1

port=10

есть метод load который в идеале должен читать файл и парсить значения ip и port. имеет вид

void Config::load(std::string filename)
{
    std::ifstream config(filename);
    po::options_description desc("Port and ip");
    desc.add_options()
        ("ip", po::value<std::string>(), "ip address")
        ("port", po::value<short>(), "port");
    po::variables_map vm;
    if (config)
        po::store(po::parse_config_file(config, desc), vm);
    std::cout << vm["ip"].as<std::string>() << std::endl;
    std::cout << vm["port"].as<std::string>() << std::endl;
}

и есть ошибка :) которая появляется при запуске скомпилированного файла.

terminate called after throwing an instance of 'boost::exception_detail::clone_impl >' what(): boost::bad_any_cast: failed conversion using boost::any_cast

Answer 1

Входные параметры:

--addr="192.168.0.1" 
--port="8080"

Код:

#include <boost/program_options.hpp>
namespace po = boost::program_options;
#include <iostream>
int main (int argc, char *argv[]) {
    po::options_description config("Conf");
    config.add_options()
                ("addr", po::value<std::string>()->required(), "IP address")
                ("port", po::value<std::string>()->required(), "Port")
                ;
    try 
    {
        po::variables_map vm;
        po::store(po::parse_command_line(argc, argv, config),vm);
        po::notify(vm);
        const std::string address = vm["addr"].as<std::string>();
        const std::string port = vm["port"].as<std::string>();
        std::cout << "address: " << address << std::endl;
        std::cout << "port: " << port << std::endl;
    } catch ( const std::exception& e ) {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

Ссылка на Wandbox.org

P.S. На всякий случай уточню - код должен быть аналогичный, за исключением того, что Вы используете parse_config_file вместо parse_command_line, т.е. парсите содержимое файла, а не параметры комммандной строки.

Answer 2

ошибку нашел сам ) моя невнимательность.

поменял строчку

std::cout << vm["port"].as<std::string>() << std::endl;

на

std::cout << vm["port"].as<short>() << std::endl;

READ ALSO
Ошибка парсинга emoji в XML

Ошибка парсинга emoji в XML

Есть следующий код по замене emoji:

155
Как работает &ldquo;Vertex Array Object&rdquo; в openGL?

Как работает “Vertex Array Object” в openGL?

Я так понимаю, VAO - это просто обертка над конкретным VBO? Те

172
Как изменить регистр i-ой буквы в c++

Как изменить регистр i-ой буквы в c++

нужно изменить символ s[0] на букву следующего регистра

185
Обертывание С++ структуры для python

Обертывание С++ структуры для python

товарищиПрошу помочь советом или указать верный путь

184