C++ ini 文件处理类-简易版

实现思路:读ini文件,用嵌套map存解析所得数据。保存时,再遍历嵌套map写入文件。

接口:

string ReadString(string section, string key, string def);
void WriteString(string section, string key, string value);

代码:

头文件:

View Code
#ifndef LINIFILE_H
#define LINIFILE_H

#include <map>
#include <string>
using namespace std;

class IniFile
{
    typedef map<string, map<string, string> > IniSectionMap;
    typedef map<string, string> IniKeyMap;
    typedef map<string, map<string, string> >::iterator IniSectionIterator;
    typedef map<string, string>::iterator IniKeyIterator;
public:
    IniFile(string path);
    ~IniFile();
    
    string ReadString(string section, string key, string def);
    void WriteString(string section, string key, string value);
    
    bool save();
    
private:
    bool parseIniFile();
    void print();
    
    string path_;
    IniSectionMap section_key_value_map_;
};

#endif

源文件:

View Code
#include <iostream>
#include <fstream>
#include <string.h>
#include "linifile.h"

IniFile::IniFile(string path)
{
    path_ = path;
    parseIniFile();
}

IniFile::~IniFile()
{

}

bool IniFile::parseIniFile()
{
    fstream iniFile(path_.c_str(), ios::in);    
    if (!iniFile.is_open())
    {
        cerr << "error opening file" << endl;
        return false;
    }
    
    //read from file line by line
    bool bDone = false;
    char szBuffer[4000];
    string line;
    string section;
    IniKeyMap temp_key_map;
    bool bInsert = false;

    while(!bDone)
    {
        szBuffer[0] = '\0';
        iniFile.getline(szBuffer, sizeof(szBuffer));
        line = szBuffer;

        if('[' == line[0])
        {
            if (bInsert)
            {
                section_key_value_map_.insert(make_pair(section, temp_key_map));
                temp_key_map.clear();
                section = "";
            }
            //line "[section]"
            int nPos = line.find_first_of(']');
            if(string::npos != nPos)
            {
                section = line.substr(1, nPos-1).c_str();
            }
        }
        else
        {
            //line "key=value"
            int nPos = line.find_first_of('=');

            if(string::npos != nPos)
            {
                temp_key_map.insert(make_pair(line.substr(0, nPos), line.substr(nPos+1, line.size()-nPos-1)));
            }
            bInsert = true;
        }

        //check for exit
        bDone = iniFile.eof() || iniFile.bad() || iniFile.fail();
    }
    
    //the last one
    if (("" != section) && (0 != temp_key_map.size()))
    {
        section_key_value_map_.insert(make_pair(section, temp_key_map));
    }
    
    iniFile.close();
    return true;
}

string IniFile::ReadString(string section, string key, string def)
{
    cout << section_key_value_map_.size() << endl;
    IniSectionIterator iter_section;
    iter_section = section_key_value_map_.find(section);
    if (section_key_value_map_.end() != iter_section)
    {
        IniKeyMap temp = iter_section->second;
        IniKeyIterator iter_key;
        iter_key = temp.find(key);
        if (temp.end() != iter_key)
        {
            return iter_key->second;
        }
    }
    return def;
}

void IniFile::WriteString(string section, string key, string value)
{
    IniSectionIterator iter_section;
    iter_section = section_key_value_map_.find(section);
    if (section_key_value_map_.end() == iter_section)
    {
        IniKeyMap key_temp_map;
        key_temp_map.insert(make_pair(key, value));
        section_key_value_map_.insert(make_pair(section, key_temp_map));
    }
    else
    {
        map<string, string> temp = iter_section->second;
        IniKeyIterator iter_key;
        iter_key = temp.find(key);
        if (temp.end() == iter_key)
        {
            (iter_section->second).insert(make_pair(key, value));
        }
        else
        {
            //update existing key
            iter_key->second = value;
        }
    }
}

bool IniFile::save()
{
    //open the INI file for writing
    fstream iniFile(path_.c_str(), ios::out|ios::trunc);
    if(!iniFile.is_open())
    {
        return false;
    }
    
    char szBuffer[4000];
    IniSectionIterator iter_section;
    IniKeyIterator iter_key;
    for (iter_section = section_key_value_map_.begin(); iter_section != section_key_value_map_.end(); iter_section++)
    {
        //write line with section name
        snprintf(szBuffer, sizeof(szBuffer), "[%s]\n", (iter_section->first).c_str());
        iniFile.write(szBuffer, strlen(szBuffer));
        
        IniKeyMap key_temp_map = iter_section->second;
        for (iter_key = key_temp_map.begin(); iter_key != key_temp_map.end(); iter_key++)
        {
            snprintf(szBuffer, sizeof(szBuffer), "%s=%s\n", (iter_key->first).c_str(), (iter_key->second).c_str());
            iniFile.write(szBuffer, strlen(szBuffer));
        }
        iniFile.write("\n", 1);
    }
    
    iniFile.close();
    return true;
}

//for test
void IniFile::print()
{
    IniSectionIterator iter_section;
    IniKeyIterator iter_key;
    for (iter_section = section_key_value_map_.begin(); iter_section != section_key_value_map_.end(); iter_section++)
    {
        cout << "section: " << iter_section->first << endl;
        IniKeyMap key_temp_map = iter_section->second;
        for (iter_key = key_temp_map.begin(); iter_key != key_temp_map.end(); iter_key++)
        {
            cout << "key: " << iter_key->first << " | value: " << iter_key->second << endl;
        }
        cout << endl;
    }
}

 

 

你可能感兴趣的:(C++ ini 文件处理类-简易版)