CLX C++ Libraries - ini
Author: clown

CLX C++ Libraries
Home >> ini

# Declaration

    template <
        class Type,
        class CharT = char,
        class Traits = std::char_traits<CharT>
    >
    class basic_ini;

    typedef basic_ini<std::basic_string<char> > ini;
    #ifdef CLX_USE_WCHAR
    typedef basic_ini<std::basic_string<wchar_t> > wini;
    #endif

# Overview

Windows で用いられていた INI ファイルを扱うためのクラスです． 指定したファイルを読み込み，["セクション名"]["キー名"] という形で対応する値にアクセスすることができます．また，insert() メソッドを用いて新たなセクション名をオブジェクトに挿入することも可能です （挿入した時点では，そのセクションに属するキーは存在しない）．

二次元連想配列 (map) を用いて実装しているため，[] 演算子でアクセスした際に， 対応するセクション and/or キーが存在しない場合は，新たに作成されることになります．

# Example

example_ini.cpp

    #include <iostream>
    #include "clx/ini.h"

    int main(int argc, char* argv[]) {
        if (argc < 2) std::exit(-1);

        try {
            clx::ini ini(argv[1]);

            ini.insert("hoge");
            ini["hoge"]["fuga"] = "foo";
            for (clx::ini::iterator p = ini.begin(); p != ini.end(); p++) {
                std::cout << "***" << p->first << "***" << std::endl;
                for (clx::ini::sub_iterator q = p->second.begin();
                    q != p->second.end(); q++) {
                    std::cout << '<' << q->first << "><"
                        << q->second << '>' << std::endl;
                }
            }

            if (ini.exist("Settings", "AnonymousRecipient")) {
                std::cout << "found!" << std::endl;
            }
        }
        catch (clx::syntax_error& e) {
            std::cerr << argv[1] << ':' << e.line() << ": error: "
                << e.what() << std::endl;
            std::exit(-1);
        }
        catch (std::runtime_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }

        return 0;
    }

    Result (test.ini)
    ***Debug***
    <LogFile><0>
    ***Output***
    <Charset><euc-jp>
    ***Settings***
    <AnonymousRecipient><0>
    <CmdName><gpg.exe>
    <DefUserID><>
    <EnableBccUser><0>
    <EnableCcUser><0>
    <EnableDefUser><0>
    <EnableFromUser><0>
    <EnableTextModeSig><0>
    <OpenPGP><0>
    <PGPCompatible><1>
    <PGPMIME><1>
    <RFC1991><0>
    <ShowPassphrase><0>
    <UseMD5><0>
    ***hoge***
    <fuga><foo>
    found!

# Template Parameter

Type
  値の型を指定します．
CharT
  文字の型を指定します．デフォルト値は，char．
Traits
  文字列を扱うためのtraitsを指定します．デフォルト値は， std::char_traits<CharT>．

# Related Types

    typedef CharT char_type;
    typedef std::basic_string<CharT, Traits> string_type;

    typedef string_type key_type;
    typedef Type value_type;

    typedef ini_container<Type, CharT, Traits> subcontainer;
    typedef typename subcontainer::iterator sub_iterator;
    typedef typename subcontainer::const_iterator const_sub_iterator;

    typedef std::map<string_type, subcontaine> container;
    typedef typename container::size_type size_type;
    typedef typename container::iterator iterator;
    typedef typename container::const_iterator const_iterator;

# Construction and Member Functions

    basic_ini();

    template <class Ch, classTr>
    basic_ini(std::basic_istream<Ch, Tr>& sin);

    explicit basic_ini(const string_type& path);
    explicit basic_ini(const char_type* path);

    virtual ~basic_ini();

    template <class Ch, class Tr>
    basic_ini& read(istream& sin);

    basic_ini& read(const string_type& path);
    basic_ini& read(const char_type* path);

コンストラクタ，および read() メソッドには入力ストリーム，または INI ファイルのパスを指定します．

    bool insert(const key_type& section);

insert() メソッドは，新たなセクションを作成する時に使用します．引数 section を指定して insert() メソッドを呼ぶと ini はキーを一つも持たない空のセクションを作成し， INI 情報を管理しているコンテナへ追加します．

    subcontainer& operator[](const key_type& key);

    bool empty() const;
    size_type size() const;

    const_iterator begin() const;
    const_iterator end() const;
    const_iterator rbegin() const;
    const_iterator rend() const;

    iterator begin();
    iterator end();
    iterator rbegin();
    iterator rend();

    const_iterator find(const key_type& section) const;
    iterator find(const key_type& section);

    bool exist(const key_type& section) const;
    bool exist(const key_type& section, const key_type& key) const;

    container& data();
    const container& data() const;