Cześć,
pisze prosty program, który przedstawia przykład z teorii automatów komórkowych. Przed uruchomieniem chciałbym, aby mój soft pobierał jakieś informacje startowe, które wcześniej zostały zapisane w trakcie działania oraz zwykłe informacje z pliku konfiguracyjnego. Pytanie brzmi w jaki sposób mógłbym ten problem rozwiązać? boost::property_tree albo boost::Program_options to to czego potrzebuje czy może dotyczy to czegoś innego?
Do tej pory tego typu kwestie rozwiązywałem poprzez zwykłe zapisanie do pliku.
Zależy jakie dane chcesz zapisać.
Ustawienia paragramu w boost::property_tree
jest bardzo poręcznym rozwiązaniem, dane tam zawarte można zapisać w pliku ini.
boost::property_tree::ini_parser::write_ini
jest proste i przyjemne w użyciu.
Pamiętaj jednak, że w zależności od systemu, lokalizacja pliku ini jest inna i dobrą praktyką jest doczytać, gdzie system zaleca zapisywać takie dane.
Zależy jakie dane chcesz zapisać.
Głównie będą to wymiary planszy, początkowe ustawienie figur lub z poprzedniego uruchomienia programu.
To są małe lekkie dane, więc plik ini jest wręcz wskazany.
A jak rozwiązać ten problem pierwszego uruchomienia programu? Mam ręcznie wypełnić plik ini z jakimiś danymi? Czy może istnieje funkcja w boost::property_tree która sprawdza czy plik nie jest pusty?
Są dwie metody
- podczas instalacji instalowany jest też plik ini z domyślnymi ustawieniami.
- odczytując wartości z
boost::property_tree
można dostarczyć wartość domyślną.
auto nodeSentence = node->get_value_optional<std::string>().get_value_or("ala ma kota");
auto ptreeOptionSentence = ptree->get_value_optional<std::string>("sekcja.opcja").get_value_or("ala ma kota");
Dzięki, mam taki kod do czytania z ini:
void Settings::load(const std::string &filename) {
pt::ptree tree;
pt::read_ini(filename, tree);
width = tree.get_value_optional<std::size_t>("board.width").get_value_or(10);
height = tree.get_value_optional<std::size_t>("board.height").get_value_or(10);
pt::ptree::const_assoc_iterator it = tree.find("board.alives.alive");
if (it == tree.not_found()) {
for (pt::ptree::value_type &v : tree.get_child("board.alives")) {
aliveCells.push_back(v.second.data());
}
}
}
lecz kompilator wyrzuca mi błąd z implementacji ptree. Jakiś pomysł jak rozwiązać ten problem?
Error C2228 left of '.get_value' must have class/struct/union Game c:\boost_1_62_0\boost\property_tree\detail\ptree_implementation.hpp 727
A tu kod do którego się odnosi:
template<class K, class D, class C>
template<class Type, class Translator> inline
optional<Type> basic_ptree<K, D, C>::get_value_optional(
Translator tr) const
{
return tr.get_value(data()); //<- tutaj
}