формат входного файла для моего кода, используя boost :: property_tree

Я рассматриваю создание файла ввода / журнала для моего кода для двух основных целей.

1) Уметь регистрировать все ключевые параметры, с которыми был запущен код, чтобы я мог воспроизвести те же результаты в будущем, если мне нужно.
2) Иметь возможность запускать / возобновлять код без необходимости жесткого кодирования параметров в коде.

Я заинтересован в подходе только с заголовками, чтобы я мог просто нести файлы заголовков вместе с моим кодом, таким образом я превратился в boost.property_tree. Из документации это, кажется, служит цели. Мой вопрос в том, какой формат файла удовлетворяет мои потребности лучше всего? Мне нужно то, что:

1) легко читается / редактируется человеком
2) может поддерживать вложенные разделы
3) может поддерживать комментарии

По умолчанию я переключился на xml, но я не уверен, что это лучший вариант, учитывая возможности разбора boost.property_tree. Например, я хочу иметь возможность анализировать что-то вроде этого:

<Grid Type = "AMR">
<Domain> -1.0 1.0 -1.0 1.0 </Domain>
<Levels> 10 5 </Levels>
<Path> /path/to/data.bin </Path>
</Grid>

Я хочу иметь возможность читать в Type собственность, а также Domain, Levels, а также Path разделы правильно и отдельно (например, Domain имеет 4 отдельных числа с плавающей точкой, соответствующих краям прямоугольника). Мой код выглядит так:

using boost::property_tree::ptree;
ptree pt;

double x = pt.get<double>("Grid.Domain");

std::cout << x << std::endl;

но я продолжаю получать conversion of data to type "d" failed, Как мне это исправить? Кроме того, является ли xml лучшим вариантом, который у меня есть, или я должен рассмотреть вопрос об изменении на другой формат?

0

Решение

boost :: property_tree также поддерживает сериализацию / десериализацию в и из JSON. JSON допускает массивы, поэтому очень легко хранить несколько значений для раздела. Вы даже можете хранить структуры в JSON (что может быть удобно, если вы хотите сохранить состояние объекта в вашей программе).

Важная оговорка: boost :: property_tree обрабатывает значения внутри себя как строки, поэтому, если вы хотите, чтобы действительный JSON мог быть прочитан вне вашей программы, вы не сможете читать числовые значения непосредственно из JSON, который вы создаете с помощью boost :: property_tree, не выполняя какой-либо приведение (в зависимости от кода чтения).

Если для вас важно сохранить типы числовых значений в вашем сохраненном файле, я бы проверил JSONCpp. Я использовал это сам, и это очень легко начать работать, и это очень легкий.

JSONCpp также поддерживает комментарии. Со страницы SourceForge:

Примечания: комментарии раньше поддерживались в JSON, но были удалены для
переносимость (комментарии, подобные C, не поддерживаются в Python). поскольку
комментарии полезны в файле конфигурации / ввода, эта функция была
сохранились.

0

Другие решения

Хорошо, я думаю, что нашел способ обрабатывать несколько значений. Одним из способов было бы прочитать все это как std::string а затем с помощью std::istringstream Вы можете отделить каждую часть очень легко. Что-то вроде этого:

std::istringstream iss(pt.get<std::string>("Grid.Domain"));
double xmin, xmax, ymin, ymax;
iss >> xmin >> xmax >> ymin >> ymax;

работает довольно хорошо Тем не менее, я не знаю, как получить Type имущество …

0

По вопросам рекламы [email protected]