Реализация конфигурационного файла C++

Возникла необходимость в интеграции конфигурационного файла в программу. В связи с этим возник ряд вопросов по выбору правильного инструментария и подхода к решению задачи в целом. Делюсь своими мыслями по данному вопросу.

Проблема 1 - Тип содержимого конфигурационного файла

Сталкивался с двумя видами реализации конфиг-файлов:

  1. XML
  2. conf/cfg/config

Пример xml конфига:

<?xml version="1.0" encoding="utf-8"?>
<MyProg.Agent>
    <Installed.Components>
        <Myprog.WebInterface = "myprog.web.service"/>
        <Myprog.SnmpMonitor = "myprog.snmp.service"/>
        <Myprog.Agent = "myprog.agent.service"/>
    </Installed.Components>
    <MyProg.Agent1 Name="local" Address="127.0.0.1" Port="1010"/>
    <MyProg.Agent2 Name="domain/agent2" Address="192.168.56.21" Port="1010"/>
    <MyProg.Server Name="domain/mainserver" Address="192.168.56.1" Port="1010"/>
    <Properties LoggerPath="/opt/MyProg/MyProg.log"/>
    <Properties LoggerLevel="debug"/>
</MyProg.Agent>

Пример conf/cfg/config:

SelfName = "Agent1"
ServAddr = "192.168.56.1"
LoggerPath = "/opt/MyProg/MyProg.log"
LoggerLevel = "info"
TimeOut = "3000"
Visibility = "1" 

Исходя из примеров, кажется что XML целесообразно использовать для инициализации заведомо неизвестного и гипотетически неограниченного числа экземпляров различных классов в программе.

В свою очередь conf - про инициализацию аргументов(необязательных), отличных от дефолтного значения в коде с довольно простой структурой.

Проблема 2 - Инструмент для чтения конфигурационных файлов

Инструментарий, по всей видимости, необходимо выбирать после того, как станет известна структура. В разработке использую C++, изучив несколько статей пришел к выводу о том, что распространено два подхода к чтению содержимого конфиг-файлов.

  1. "Кастомное" чтение через открытие файла в std::ifstream
  2. Чтение с использованием boost

Кастомное решение довольно прозрачно и представляет собой построчный парсинг файла. Это кажется оптимальным решением для чтения файлов типа config/cfg/conf.

В свою очередь boost - про удобную работу с большим количеством объемных файлов динамической структуры типа XML.

В своем решении на данный момент планирую использовать один cfg, чтение которого будет происходить разово при запуске программы. Из того, что сформулировал ранее получается, что оптимальный в моем случае вариант - самописный ридер.

В чем я ошибаюсь? Можете посоветовать инструмент для решения моей задачи более изящным путем?


Ответы (0 шт):