Реализация конфигурационного файла C++
Возникла необходимость в интеграции конфигурационного файла в программу. В связи с этим возник ряд вопросов по выбору правильного инструментария и подхода к решению задачи в целом. Делюсь своими мыслями по данному вопросу.
Проблема 1 - Тип содержимого конфигурационного файла
Сталкивался с двумя видами реализации конфиг-файлов:
- XML
- 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++, изучив несколько статей пришел к выводу о том, что распространено два подхода к чтению содержимого конфиг-файлов.
- "Кастомное" чтение через открытие файла в
std::ifstream
- Чтение с использованием
boost
Кастомное решение довольно прозрачно и представляет собой построчный парсинг файла. Это кажется оптимальным решением для чтения файлов типа config/cfg/conf.
В свою очередь boost
- про удобную работу с большим количеством объемных файлов динамической структуры типа XML.
В своем решении на данный момент планирую использовать один cfg
, чтение которого будет происходить разово при запуске программы. Из того, что сформулировал ранее получается, что оптимальный в моем случае вариант - самописный ридер.
В чем я ошибаюсь? Можете посоветовать инструмент для решения моей задачи более изящным путем?