example.cpp 4.14 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
#include <iostream>
#include <cstring>
#include <stdint.h>
#include "../INI.h"

using namespace std;

void centerString(string str); //Printing to console
std::string getStringFromFile(const std::string& path); //Source for data loading from memory.

int main()
{
   ///Declare
   typedef INI<> ini_t;  //Makes things shorter/easier to write <Section, Key, Value>
   //or
   //typedef INI<string, string, string> ini_t;  //Equivelant to previous line when wide characters are disabled
   ini_t ini("file.ini", true);  //File to open/default save filename. The constuctor is set to parse by default, unless specified as false

   ///Manipulate and access contents
   centerString("########## Access & Manipulate Contents ##########");

   //Common usage
   ini.create("Section 1");
   ini.create("Section 2");
   ini.get("Key1", "DefaultValue");
   ini.select("Section 1");
   ini.set("Key2", "Value");
   ini.save(); //Save contents to file, optional filename parameter available
   ini.clear(); //Clear INI contents from memory

   //Extended usage
   ini["Section Name"]["Key"] = "Value";  //You are not required to create a section first

   ini.create("Section1");  //Also selects as current section
   ini.create("Section2");  //Current

   ini.set("Key1", "Value1");  //Added pair under section "Section2"

   ini.select("Section1");  //Current
   cout << ini.get("Key1", "-1") << endl;  //Returns "-1" as no key exists, no default will return NULL for data type, eg int() is 0

   ini.select("Section2");
   ini.set("Key1", "1.123");
   cout << ini.get("Key1", -1.0) << endl;  //Return value as double
   ini.set(123, 123);  //Will convert to provided INI data type for key/value, in this case string for both

   ini.save();
   ini.clear();
   ini.parse();  //Parses file into objects in memory

   cout << ini["Section2"]["Key1"] << endl;  //Returns "Value1", slightly more overhead involved seeking section, avoid using excessively

   ///Iterate through sections and keys for both C++11 and C++98
   centerString("########## Iterate Contents ##########");

#ifdef FINI_CPP11
   for(auto i: ini.sections)
   {
      cout << "[" << i.first << "]" << endl;

      //for(auto j = i.second->begin(); j != i.second->end(); j++)
      for(auto j: *i.second)
      {
         cout << " " << j.first << "=" << j.second << endl;
      }
   }
#else
   for(ini_t::sectionsit_t i = ini.sections.begin(); i != ini.sections.end(); i++)
   {
      //Section name as ini_t::section_t
      cout << i->first << endl;

      if (i->second->size() == 0)  //No keys/values in section, skip to next
         continue;

      for(ini_t::keysit_t j = i->second->begin(); j != i->second->end(); j++)
      {
         //Name as ini_t::key_t & Value as ini_t::key_t
         cout << " " << j->first << "=" << j->second << endl;
      }
   }
#endif

///Example with different data types
   typedef INI <unsigned char, string, float> ini_int_t;  //Makes things shorter/easier to write <Section, Key, Value>
   ini_int_t ini_int("file_ints.ini", false);  //File to open/default save filename. The constuctor is set to parse by default, unless specified as false
   for(int i = 1; i <= 200; i++)
   {
      ini_int.create(i); //Section
      ini_int.set("Key", i / 2.f);
   }

   ini_int.save();

///Wide char support example (please define FINI_WIDE_SUPPORT in project)
   /*
   ini_t ini_w("file.ini", true);
   wcout << ini_w[L"Section2"][L"Key1"] << endl;
   */

///Load from memory
   std::string str = getStringFromFile("config/test.ini"); //Allows us to tap into a source for the purpose of this example

   ini_t ini_mem((void*)str.c_str(), str.size(), true); //This is the line which parses data from memory

///Merge contents and keep values
   ini_t inid("file.ini", true);
   ini_t inis("merge.ini", true);
   inid.merge(inis, true);
   inid.save("merged.ini");

   return EXIT_SUCCESS;
}

void centerString(string str)
{
   const char* s = str.c_str();
   int l = strlen(s);
   int pos = (int)((80 - l) / 2);
   for(int i = 0; i < pos; i++)
   cout << " ";
   cout << s << endl;
}

std::string getStringFromFile(const std::string& path) {
  std::ostringstream buf;
  std::ifstream input (path.c_str());
  buf << input.rdbuf();
  return buf.str();
}