自己写的一个使用glib库访问windows平台ini格式的配置文件的类CConfig。只实现了读写32位整数,64位整数和字符串功能。
/*************************************************************************
> File Name: CConfig.h
> Author:
> Mail:
> Created Time: 2016年08月03日 星期三 09时52分13秒
************************************************************************/
#ifndef _CCONFIG_H
#define _CCONFIG_H
#include <glib.h>
#define ERROR_INFO_LEN 65535
#define FILE_PATH_LEN 256
class CConfig
{
public:
char* errorinfo;
char* filePath;
CConfig();
~CConfig();
bool loadConfig(const char* file);
bool saveConfig();
bool getInt(const char* group,const char* key,int *value);
bool getInt64(const char* group,const char* key,long long *value);
bool getStr(const char* group,const char* key,char *value);
bool setInt(const char* group,const char* key,int value);
bool setInt64(const char* group,const char* key,long long value);
bool setStr(const char* group,const char* key,const char* value);
private:
GKeyFile *keyfile;
};
#endif
/*************************************************************************
> File Name: CConfig.cpp
> Author:
> Mail:
> Created Time: 2016年08月03日 星期三 10时02分48秒
************************************************************************/
#include <errno.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <glib.h>
#include <stdlib.h>
#include "CConfig.h"
CConfig::CConfig()
{
keyfile = NULL;
errorinfo = (char*)malloc(ERROR_INFO_LEN);
filePath = (char*)malloc(FILE_PATH_LEN);
}
CConfig::~CConfig()
{
if(keyfile)
g_key_file_free(keyfile);
free(errorinfo);
free(filePath);
}
bool CConfig::loadConfig(const char* file)
{
memset(errorinfo,0,ERROR_INFO_LEN);
memset(filePath,0,FILE_PATH_LEN);
if(strlen(file) > FILE_PATH_LEN)
{
sprintf(errorinfo,"[CConfig.cpp][CConfig::loadConfig(const char* file)][配置文件路径过长]");
return false;
}
GError* err = NULL;
keyfile = g_key_file_new();
g_key_file_set_list_separator(keyfile,',');
if(!g_key_file_load_from_file(keyfile,file,(GKeyFileFlags)0,&err))
{
sprintf(errorinfo,"[CConfig.cpp][CConfig::loadConfig(const char* file)][can not load %s fail:%s]",file,err->message);
g_error_free(err);
return false;
}
return true;
}
bool CConfig::saveConfig()
{
GError* err = NULL;
if(g_key_file_save_to_file(keyfile,filePath,&err))
{
sprintf(errorinfo,"[CConfig.cpp][CConfig::saveConfig()][保存配置文件%s失败. fail:%s]",filePath,err->message);
return false;
}
return true;
}
bool CConfig::getInt(const char* group,const char* key,int *value)
{
memset(errorinfo,0,sizeof(errorinfo));
GError *err = NULL;
*value = g_key_file_get_integer(keyfile,group,key,&err);
if(err)
{
sprintf(errorinfo,"[CConfig.cpp][CCConfig::getInt(const char* group,const char* key,int &value)][error occur. fail:%s]",err->message);
return false;
}
return true;
}
bool CConfig::getInt64(const char* group,const char* key,long long *value)
{
memset(errorinfo,0,sizeof(errorinfo));
GError *err = NULL;
*value = g_key_file_get_int64(keyfile,group,key,&err);
if(err)
{
sprintf(errorinfo,"[CConfig.cpp][CCConfig::getInt64(const char* group,const char* key,int &value)][error occur. fail:%s]",err->message);
return false;
}
return true;
}
bool CConfig::getStr(const char* group,const char* key,char *value)
{
memset(errorinfo,0,sizeof(errorinfo));
GError *err = NULL;
char* val = g_key_file_get_string(keyfile,group,key,&err);
if(err)
{
sprintf(errorinfo,"[CConfig.cpp][CCConfig::getStr(const char* group,const char* key,char *value)][error occur. fail:%s]",err->message);
return false;
}
if(strlen(val) > sizeof(value))
{
sprintf(errorinfo,"[CConfig.cpp][CCConfig::getStr(const char* group,const char* key,int &value)][读取的配置内容的大小超过了存储缓冲区]");
return false;
}
memcpy(value,val,strlen(val));
return true;
}
bool CConfig::setInt(const char* group,const char* key,int value)
{
g_key_file_set_integer(keyfile,group,key,value);
return true;
}
bool CConfig::setInt64(const char* group,const char* key,long long value)
{
g_key_file_set_int64(keyfile,group,key,value);
return true;
}
bool CConfig::setStr(const char* group,const char* key,const char* value)
{
g_key_file_set_string(keyfile,group,key,value);
return true;
}