linux环境下配置文件读写类

本文介绍了一个在ARMLinux环境中,利用libconfig库实现的配置文件读写类,支持单例模式,适用于多种处理器,特别适合GCC-linaro5.5.0编译环境,提供文件操作和数据类型转换功能。

      我们的程序无论运行在什么环境,很多都会用到配置文件,Windows环境有系统自带的SDK读写ini配置文件,而linux没有,本文分享一个arm  linux环境下读写配置文件的类,利用libconfig封装而成,且是单实例类,ArmV7处理器可以直接用(gcc-linaro5.5.0编译的)。

#ifndef __CFG_SETTINGS_H__
#define __CFG_SETTINGS_H__

#include <mutex>

#include "libconfig.h"


class CfgSettings{
private:
    static CfgSettings c_settings;
    config_t c_config;
    std::mutex c_mutex;
    
private:
    void init();
public:
    CfgSettings(/* args */);
    ~CfgSettings();

    static Settings &getInstance();
    
    // 打开配置文件
    int  open(const char *filename);
    
    // 读指定的配置项
    int  read(std::string path, std::string &value);
    //写指定配置项---string
    int  write(std::string path, std::string &value);
    //写指定配置项---int
    int  write(std::string path, int &value);
    int  save(std::string fname);
    /**/
    void  close();
};

#endif /* __CFG_SETTINGS_H__ */

#include "CfgSettings.h"


//类实例化
CfgSettings CfgCfgSettings::c_settings;


CfgSettings::CfgSettings(/* args */){
    init();
}

CfgSettings::~CfgSettings(){
    close();
}

CfgSettings &CfgSettings::getInstance(){
    return c_settings;
}

void CfgSettings::init(){
    config_init(&c_config);
}

int CfgSettings::open(const char *filename){
    std::lock_guard<std::mutex> lock(c_mutex);
    if(NULL == filename){
        return -1;
    }
    if(-1 == access(filename, F_OK)){
        return -1;
    }
    int ret = config_read_file(&c_config, filename);
    if(!ret)
    {
        config_destroy(&c_config);
        return ret;
    }
    return ret;
}

int  CfgSettings::read(std::string path, std::string &value){
    std::lock_guard<std::mutex> lock(c_mutex);
    if(path.empty()){
        return -1;
    }
    const char *v = NULL;
    int ret = config_lookup_string(&c_config, (const char *)path.c_str(), &v);
    if(ret){
        value = v;
        return 0;
    } else {
        return -1;
    }
}
int CfgSettings::save(std::string fname){
    if(fname.empty()){
        return -1;
    }
    return config_write_file(&c_config, (const char *)fname.c_str());
}
int  CfgSettings::write(std::string path, std::string &value){
    std::lock_guard<std::mutex> lock(c_mutex);
    if(path.empty()){
        return -1;
    }
    config_setting_t *root = config_root_setting(&c_config);
    config_setting_t *setting = config_setting_lookup(root, (const char *)path.c_str());
    if(NULL == setting){
        setting = config_setting_add(root, path.c_str(), CONFIG_TYPE_STRING);
    } 
    return config_setting_set_string(setting, value.c_str());
}

int  CfgSettings::write(std::string path, int &value){
    std::lock_guard<std::mutex> lock(c_mutex);
    if(path.empty()){
        return -1;
    }
    config_setting_t *root = config_root_setting(&c_config);
    config_setting_t *setting = config_setting_lookup(root, (const char *)path.c_str());
    if(NULL == setting){
        setting = config_setting_add(root, path.c_str(), CONFIG_TYPE_INT);
    } 
    return config_setting_set_int(setting, value);
}

void CfgSettings::close(){
    config_destroy(&c_config);
}

点击下载  全部代码和库 [包含封装类的代码libconfig.a和libconfig.h ]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

previewer1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值