Linux、Window下INI文件的读写操作C++类

1、适用于C++项目,适用于Windows和Linux平台,依赖STL标准库。
2、用于C++读取INI文件,写入INI文件,以及查找相应键值对的快速操作。
3、在项目中需要此功能时,只需要引入两个文件,即:INIParser.h和INIParser.cpp。


INIParser.h

#ifndef INI_PARSER_H
#define INI_PARSER_H
 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
//其他部分省略
//主要的INIParser类
class INIParser
{
public:
    int ReadINI(string path);
    string GetValue(string root, string key);
    vector::size_type GetSize(){return map_ini.size();}
    vector::size_type SetValue(string root, string key, string value);
    int WriteINI(string path);
    void Clear(){map_ini.clear();}
private:
    map map_ini;
};
 
#endif // INI_PARSER_H
INIParser.cpp

#include "iniparser.h"

//remove all blank space
string &TrimString(string &str)
{
    string::size_type pos = 0;
    while(str.npos != (pos = str.find(" ")))
        str = str.replace(pos, pos+1, "");
    return str;
}
//read in INI file and parse it
int INIParser::ReadINI(string path)
{
    ifstream in_conf_file(path.c_str());
    if(!in_conf_file) return 0;
    string str_line = "";
    string str_root = "";
    vector vec_ini;
    while(getline(in_conf_file, str_line))
    {
        string::size_type left_pos = 0;
        string::size_type right_pos = 0;
        string::size_type equal_div_pos = 0;
        string str_key = "";
        string str_value = "";
        if((str_line.npos != (left_pos = str_line.find("["))) && (str_line.npos != (right_pos = str_line.find("]"))))
        {
            //cout << str_line.substr(left_pos+1, right_pos-1) << endl;
            str_root = str_line.substr(left_pos+1, right_pos-1);
        }
        if(str_line.npos != (equal_div_pos = str_line.find("=")))
        {
           str_key = str_line.substr(0, equal_div_pos);
           str_value = str_line.substr(equal_div_pos+1, str_line.size()-1);
           str_key = TrimString(str_key);
           str_value = TrimString(str_value);
           //cout << str_key << "=" << str_value << endl;
        }
        if((!str_root.empty()) && (!str_key.empty()) && (!str_value.empty()))
        {
           ININode ini_node(str_root, str_key, str_value);
           vec_ini.push_back(ini_node);
           //cout << vec_ini.size() << endl;
        }
    }
    in_conf_file.close();
    in_conf_file.clear();
    //vector convert to map
    map map_tmp;
    for(vector::iterator itr = vec_ini.begin(); itr != vec_ini.end(); ++itr)
    {
        map_tmp.insert(pair(itr->root, ""));
    }
    SubNode sn;
    for(map::iterator itr = map_tmp.begin(); itr != map_tmp.end(); ++itr)
    {
       //cout << itr->first << endl;
       for(vector::iterator sub_itr = vec_ini.begin(); sub_itr != vec_ini.end(); ++sub_itr)
       {
           if(sub_itr->root == itr->first)
           {
               //cout << sub_itr->key << "=" << sub_itr->value << endl;
               sn.InsertElement(sub_itr->key, sub_itr->value);
           }
       }
       map_ini.insert(pair(itr->first, sn));
    }
    return 1;
}
//get value by root and key
string INIParser::GetValue(string root, string key)
{
    map::iterator itr = map_ini.find(root);
    map::iterator sub_itr = itr->second.sub_node.find(key);
    if(!(sub_itr->second).empty())
        return sub_itr->second;
    return "";
}
//write ini file
int INIParser::WriteINI(string path)
{
    ofstream out_conf_file(path.c_str());
    if(!out_conf_file)
        return -1;
    //cout << map_ini.size() << endl;
    for(map::iterator itr = map_ini.begin(); itr != map_ini.end(); ++itr)
    {
       //cout << itr->first << endl;
       out_conf_file << "[" << itr->first << "]" << endl;
       for(map::iterator sub_itr = itr->second.sub_node.begin(); sub_itr != itr->second.sub_node.end(); ++sub_itr)
       {
           //cout << sub_itr->first << "=" << sub_itr->second << endl;
           out_conf_file << sub_itr->first << "=" << sub_itr->second << endl;
       }
    }
    out_conf_file.close();
    out_conf_file.clear();
    return 1;
}
//set value
vector::size_type INIParser::SetValue(string root, string key, string value)
{
    map::iterator itr = map_ini.find(root);
    if(map_ini.end() != itr)
        itr->second.sub_node.insert(pair(key, value));
    else
    {
        SubNode sn;
        sn.InsertElement(key, value);
        map_ini.insert(pair(root, sn));
    }
    return map_ini.size();
}


你可能感兴趣的:(Linux、Window下INI文件的读写操作C++类)