24 Ağustos 2017 Perşembe

property_tree ini

property_tree Sınıfı
Giriş
Şu satırları dahil ederiz.
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
begin metodu
Şöyle yaparız.
for (auto& section : ptree) {
  ...
}
Örnek
Elimizde şöyle bir dosya olsun.
[OBJECT]
properties1=val1, val2, val3
porperty2=Blah
property3=Blah
property4=Blah
porperty5=Bla bla bla

[OBJECT]
properties1=val1
porperty2=Blah
property3=Blah
property4=Blah
porperty5=Bla bla bla
Bu dosyayı şöyle bir nesneye okumak isteyelim.
struct Object {
    std::string properties1, property2, property3, property4, property5;
};
Her section'ı okumak için şöyle yaparız.
void read(ptree const& pt, std::string& s) {
  s = pt.get_value(s);
}

void read(ptree const& pt, Object& object) {
  read(pt.get_child("properties1"), object.properties1);
  read(pt.get_child("property2"), object.property2);
  read(pt.get_child("property3"), object.property3);
  read(pt.get_child("property4"), object.property4);
  read(pt.get_child("property5"), object.property5);
}
equal_range metodu
Şöyle yaparız. company isimli bir düğüm aranır. Düğüm bulunursa altına conditions ismi ile yeni bir düğüm eklenir.
auto it = root.equal_range("company").second;
if (it != root.not_found())
  root.insert(root.to_iterator(it), make_pair("conditions",attached_node));
Aynı şeyi şöyle de yapabiliriz. Elimizde find_by_key metodu olsun
template <typename It>
It find_by_key(It f, It l, std::string const& key) {
  return std::find_if(f, l, [&](auto const& pair) {
    return pair.first == key;
  });
}
Bu metodu kullanmak için şöyle yaparız. find_by_key reverse iterator kullandığı için döndürdüğü sonuç .base() metodu ile normal iterator haline getirilir.
auto it = find_by_key(root.rbegin(), root.rend(), "company");
if (it != root.rend())
  root.insert(it.base(), make_pair("conditions",attached_node));
get metodu
string için şöyle yaparız.
boost::property_tree::ptree pt;
...
std::cout << pt.get<std::string>("Section1.Value1");
std::cout << pt.get<std::string>("Section1.Value2");
int için şöyle yaparız.
int n = pt.get<int>("Section.ValueOfN");
get metodu - default değer
Şöyle yaparız.
testval = pt.get("foo.bar", 1); 
Eğer dönüş değerini açıkça belirtmek istersek şöyle yaparız.
testval = pt.get<int>("foo.bar", 1);  // gets foo.bar from pt, or 1 if not found.
insert metodu
Şöyle yaparız. Belirtilen iterator konumuna ismi olan yeni bir düğüm ekler. Şöyle yaparız.
ptree root;
root.put("building.age", "42");
root.put("company.age", "32");
root.put("street.age", "19");

ptree attached_node;
attached_node.put("confirmed","yes");
attached_node.put("approved","yes");

for(auto it=root.begin();it!=root.end();++it)
{
  std::cout
          << (it->first)
          << ": "
          << (it->second.get<std::string>("age"))
          << std::endl;
  if(it->first=="company")
    root.insert(it,make_pair("conditions",attached_node));
}
put metodu
Şöyle yaparız.
ptree root;
root.put("building.age", "42");
root.put("company.age", "32");
root.put("street.age", "19");

Free Style metodlar
read_ini metodu
Açıklaması şöyle
Clears existing contents of property tree. In case of error the property tree unmodified.
Şöyle yaparız.
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("config.ini", pt);
Eğer ini dosyasında aynı section içinde aynı anahtar isimi varsa exception fırlatabilir. Bu durumda boost::program_options::parse_config_file() kullanılabilir.
[section_1]
  key_1=value_1
  key_1=value_2
  ...
  key_n=value_n
[section_2]
  key1=value_1
  key1=value_2
  ...
  key_n=value_1
  key_n=value_2
[]
...
[section_n]
...
write_ini metodu
Elimizde bir ini dosyası olsun
[Section1]
Value1=1
ini dosyasını okuyup bir alanı değiştirdikten sonra kaydetmek için şöyle yaparız.
try
{
  boost::property_tree::ptree pt;
  boost::property_tree::ini_parser::read_ini("testini.ini", pt);

  int i = pt.get<int>("Section1.Value1");

  std::cout << i << std::endl;

  pt.put("Section1.Value1", 32);

  boost::property_tree::ini_parser::write_ini( "testini.ini", pt );
}
catch (std::exception& e)
{
  std::cout << e.what() << std::endl;
} 
Çıktı olarak şunu alırız
[Section1]
Value1=32

Hiç yorum yok:

Yorum Gönder