文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用C++实现简易的.ini配置文件解析器

2023-07-05 10:44

关注

本篇内容介绍了“怎么用C++实现简易的.ini配置文件解析器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在最开始实例化一个IniHelper 可以使用默认的config.ini文件路径,也可以自己传入一个文件路径(读取指定位置的config.ini)

1.saveIniConfig();将内存中的配置写入config.ini2.LogIniConfig()打印config.ini3.setIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& value);设置sectionName中keyName为value,如果原来没有将会添加4.IniValue getIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& defValue) const; 获取指定位置的config,如果没有,将返回默认值5.bool removeIniConfig(const std::string& sectionName,const std::string& keyName); 删除指定位置的config里面使用到的IniValue重载了类型转换运算符,可以直接转换为std::string

编译使用的是VScode + CMake

代码

Util.h

#pragma once#define NAME_SPACE_START(name) namespace name {#define NAME_SPACE_END() }#include <string>#include <map>#ifndef _UTIL_#define _UTIL_NAME_SPACE_START(INI)#define REMOVE_SPACE(str) \    for(auto it=str.begin();it!=str.end();){    \        if(*it==' ') it=str.erase(it);      \        else break;                         \    }#define INI_FILE_PATH "config.ini"class IniValue{public:    friend class IniHelper;    IniValue();    IniValue(const bool val);    IniValue(const int val);    IniValue(const char* val);    IniValue(const std::string val);    IniValue& operator=(const bool& val);    IniValue& operator=(const int& val);    IniValue& operator=(const char* val);    IniValue& operator=(const std::string& val);    operator bool() const;    operator int() const;    operator std::string() const;private:    std::string m_value;};class IniHelper{private:    std::map<std::string, std::map<std::string, IniValue>> m_map;    std::string m_filePath{INI_FILE_PATH};public:    IniHelper();    IniHelper(const std::string& filePath);    void saveIniConfig();    void LogIniConfig() const;    void setIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& value);    IniValue getIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& defValue) const;    bool removeIniConfig(const std::string& sectionName,const std::string& keyName);protected:    void loadIniFile();    void trim(std::string& str);};NAME_SPACE_END()#endif //!_UTIL_

Util.cpp

#include "Util.h"#include <algorithm>#include <atomic>#include <cstring>#include <cwchar>#include <exception>#include <fstream>#include <ios>#include <iostream>#include <iterator>#include <locale>#include <map>#include <ostream>#include <sstream>#include <stdlib.h>#include <streambuf>#include <string>NAME_SPACE_START(INI)IniValue::IniValue(){}IniValue::IniValue(const bool val){    m_value=val?"true":"false";}IniValue::IniValue(const int val){    m_value=std::to_string(val);}IniValue::IniValue(const char* val){    m_value=val;}IniValue::IniValue(const std::string val){    m_value=val;}IniValue& IniValue::operator=(const bool& val){    IniValue temp(val);    m_value=temp.m_value;    return *this;}IniValue& IniValue::operator=(const int& val){    IniValue temp(val);    m_value=temp.m_value;    return *this;}IniValue& IniValue::operator=(const char* val){    m_value=val;    return *this;}IniValue& IniValue::operator=(const std::string& val){    m_value=val;    return *this;}IniValue::operator bool() const{    return m_value=="true"?true:false;}IniValue::operator int() const{    std::stringstream ss(m_value);    int res=0;    ss>>res;    return res;}IniValue::operator std::string() const{    return m_value;}IniHelper::IniHelper(){    loadIniFile();}IniHelper::IniHelper(const std::string& filePath){    m_filePath=filePath;    loadIniFile();}void IniHelper::saveIniConfig(){    std::fstream file;    file.open(m_filePath,std::ios_base::out);    if(file.fail()) return;    for(auto it=m_map.begin();it!=m_map.end();it++){        std::string sectionName="["+it->first+"]\n";        file<<sectionName;        auto keySection = it->second;        for(auto key=keySection.begin();key!=keySection.end();key++){            std::string keyValue=key->first;            keyValue.append("=").append(key->second.m_value).append("\n");            file<<keyValue;        }    }    file.close();}void IniHelper::LogIniConfig() const{    for(auto it=m_map.begin();it!=m_map.end();it++){        std::string sectionName="["+it->first+"]\n";        std::cout<<sectionName;        auto keySection = it->second;        for(auto key=keySection.begin();key!=keySection.end();key++){            std::string keyValue=key->first;            keyValue.append("=").append(key->second.m_value).append("\n");            std::cout<<keyValue;        }    }}void IniHelper::setIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& value){    if(m_map.find(sectionName)==m_map.end()){        std::map<std::string, IniValue> temp;        temp[keyName]=value;        m_map[sectionName]=temp;    }    else{        m_map[sectionName][keyName]=value;    }}IniValue IniHelper::getIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& defValue) const{    if(m_map.find(sectionName)==m_map.end()) return defValue;    std::map<std::string, IniValue> mapping=m_map.at(sectionName);    if(mapping.find(keyName)==mapping.end()) return defValue;    return mapping[keyName];}bool IniHelper::removeIniConfig(const std::string& sectionName,const std::string& keyName){    try {        if(m_map.find(sectionName)==m_map.end()) return true;        auto pos = m_map.at(sectionName).find(keyName);        if(pos==m_map.at(sectionName).end()) return true;        m_map.at(sectionName).erase(pos);        return true;    } catch (std::exception ex) {        //std::cout<<ex.what()<<std::endl;        return false;    }}void IniHelper::loadIniFile(){    std::fstream file;    file.open(m_filePath,std::ios_base::in);    if(file.fail()) return;    std::string sectionName="",t="";    while(std::getline(file,t)){        trim(t);        //去除前后空格        if(t=="\n"||t=="") continue;        else if(t[0]=='['){            sectionName = t.substr(1,t.size()-2);            std::map<std::string, IniValue> p;            m_map[sectionName]=p;        }        else{            if(sectionName=="") continue;            int left=0,right=0,equalPos=0;            equalPos=t.find("=");            if(equalPos==std::string::npos) continue;            std::string keyName="",keyValue="";            keyName=t.substr(0,equalPos);            keyValue=t.substr(equalPos+1,t.size()-1-equalPos);            trim(keyName);            trim(keyValue);            m_map[sectionName][keyName]=keyValue;        }    }    file.close();}void IniHelper::trim(std::string& str){    REMOVE_SPACE(str);    std::reverse(str.begin(), str.end());    REMOVE_SPACE(str);    std::reverse(str.begin(), str.end());}NAME_SPACE_END()

main.cpp

#include <iostream>#include <string>#include "Util.h"using namespace std;using namespace INI;int main(){    IniHelper file("../config.ini");    //file.removeIniConfig("localhost", "name");    file.setIniConfig("localhost", "name", "cxn");    file.LogIniConfig();    file.saveIniConfig();    return 0;}

运行截图

怎么用C++实现简易的.ini配置文件解析器

“怎么用C++实现简易的.ini配置文件解析器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯