您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么用C++實(shí)現(xiàn)簡(jiǎn)易的.ini配置文件解析器”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
在最開(kāi)始實(shí)例化一個(gè)IniHelper 可以使用默認(rèn)的config.ini文件路徑,也可以自己傳入一個(gè)文件路徑(讀取指定位置的config.ini)
1.saveIniConfig(); 將內(nèi)存中的配置寫入config.ini 2.LogIniConfig() 打印config.ini 3.setIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& value);設(shè)置sectionName中keyName為value, 如果原來(lái)沒(méi)有將會(huì)添加 4.IniValue getIniConfig(const std::string& sectionName,const std::string& keyName,const std::string& defValue) const; 獲取指定位置的config,如果沒(méi)有,將返回默認(rèn)值 5.bool removeIniConfig(const std::string& sectionName,const std::string& keyName); 刪除指定位置的config 里面使用到的IniValue重載了類型轉(zhuǎn)換運(yùn)算符,可以直接轉(zhuǎn)換為std::string
編譯使用的是VScode + CMake
#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_
#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()
#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++實(shí)現(xiàn)簡(jiǎn)易的.ini配置文件解析器”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。