Файл конфигурации с использованием переменных среды - PullRequest
0 голосов
/ 29 февраля 2020

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

directory=${HOME}/folder1/

Однако, когда я анализирую эту конфигурацию, это чтение ${HOME} в виде строки, что явно не то, что я хочу.

Я написал свой собственный парсер на C ++, на случай, если мне понадобится что-то особенное. Прямо сейчас это очень простое c чтение и анализ.

void Config_Parser::parse_config_by_delimiter(string config, string delimiter) {
   ifstream infile(config);
   while (infile >> line) {
      key = line.substr(0, line.find(delimiter));
      value = line.substr(line.find(delimiter)+1);
      if (this->config_settings.find(key) != this->config_settings.end()) {
         cout << "Cannot use config... same key is set multiple times" << endl;
      }
      this->config_settings.insert({key, value});
   }
}

Код, кажется, работает хорошо для всех других настроек конфигурации (все, что не использует переменную окружения), поэтому я не думаю, что его проблема с кодом. Но я нуб C ++ ie, так что он здесь в любом случае.

Когда я анализирую и распечатываю значение:

Фактический результат: ${HOME}/folder1/

Ожидается / желаемый выход: /home/my_dir/folder1/

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Является ли следующий синтаксис конфигурации приемлемым для вас?

directory = getenv("HOME") + "/folder1/";

Если это так, то библиотека анализатора конфигурационных файлов, которую я написал под названием Config4 *, может делать то, что вы хотите. Вы можете найти его в http://www.config4star.org.

. Я рекомендую прокрутить веб-страницу вниз до «Скачать руководства» и получить Руководство по началу работы с Config4 * и Config4 * Руководство по API C ++ . Главы 2 (обзор синтаксиса) и 3 (обзор API) руководства «Приступая к работе» должно быть более чем достаточно для начала работы.

0 голосов
/ 29 февраля 2020

Не проверено

Вы можете использовать wordexp, чтобы выполнить расширение строк в формате poix.

Функция wordexp () выполняет shell- подобно расширению строки s и возвращает результат в структуре, на которую указывает p.

Вам потребуется #include <wordexp.h>

Возможно, вы также захотите указать флаг WRDE_NOCMD для предотвращения выполнения команды подоболочки.

http://man7.org/linux/man-pages/man3/wordexp.3.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...