【C++】手搓读写properties文件源码

【C++】手搓读写properties文件源码

    • 参考文章

思路
properties文件实际上就是键值对的一种形式,用等号连接键和值。c++中和键值对最贴切的就是STL中的map了。所以我使用map作为properties的实际内存存储,同时为了方便使用,另外多一个set类型的字段记录所有的key。大致流程为:

1、逐行扫描文件内容;
2、过滤注释(#后面的为注释);
3、根据等号切割key和value;
4、保存key和value到map中;

需求:
1、当key没有值时:可以设定个默认值
2、读取文件时只有KEY没哟默认值会报错,添加一个默认值给该KEY
3、修改KEY的值时并保存到文件中

properties.h 头文件

/********************************************************************************* @file           : properties.h* @author         : CircleDBA* @mail           : weiyuanquan@kingbase.com.cn* @blog           : circle-dba.blog.csdn.net* @date           : 24-5-8*******************************************************************************/#ifndef KINGBASEMANAGERTOOLS_PROPERTIES_H
#define KINGBASEMANAGERTOOLS_PROPERTIES_H#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <algorithm>
#include <sstream>
#include <vector>
#include <set>
#include <filesystem>using namespace std;namespace Circle {class properties {private:string config_path;map<string, string>* props = nullptr;set<string>* keys = nullptr;void trim(string& s);vector<string> split(const string& str, char pattern);public:properties();virtual ~properties();void file(boost::filesystem::path path);bool is_exists();bool load(std::string defaultValue);bool load(){load("None");};set<string>* getKeys() const;map<string, string>* getProps() const;string getValue(const string& key,const string& defaultValue);bool setValue(const string& key,const string& Value);};} // Circle#endif //KINGBASEMANAGERTOOLS_PROPERTIES_H

properties.cpp 文件

/********************************************************************************* @file           : properties.cpp* @author         : CircleDBA* @mail           : weiyuanquan@kingbase.com.cn* @blog           : circle-dba.blog.csdn.net* @date           : 24-5-8*******************************************************************************/#include "properties.h"namespace fs = std::filesystem;Circle::properties::properties() {this->props = new map<string, string>();this->keys = new set<string>();
}Circle::properties::~properties() {delete props;delete keys;}
//设置配置文件路径
void Circle::properties::file(std::string path){this->config_path = path;
}
//判断配置文件是否存在
bool Circle::properties::is_exists(){return fs::exists(this->config_path);
}void Circle::properties::trim(string& s)
{if (!s.empty()){s.erase(0, s.find_first_not_of(" "));s.erase(s.find_last_not_of(" ") + 1);}}vector<string> Circle::properties::split(const string& str, char pattern)
{vector<string> res;stringstream input(str);string temp;while (getline(input, temp, pattern)){res.push_back(temp);}return res;
}bool Circle::properties::load(std::string defaultValue = "None"){std::ifstream file(this->config_path);std::string line;while (getline(file, line)) {trim(line);//去空行if (line.empty() || line == "\r" || line[0] == '#'){continue;}//处理等号后为空的配置vector<string> res = split(line, '=');if (res.size() < 2){res[1] = defaultValue;}int t = res[1].find("#");if (t != string::npos) {res[1].erase(t);}for_each(res.begin(), res.end(), [=](string& s)mutable {trim(s);});props->insert(make_pair(res[0], res[1]));keys->insert(res[0]);}file.close();
}set<string>* Circle::properties::getKeys() const {return keys;
}map<string, string>* Circle::properties::getProps() const {return this->props;
}string Circle::properties::getValue(const string& key,const string& defaultValue) {if (props->find(key) == props->end()){return defaultValue;}string value =this->props->at(key);return value;
}bool Circle::properties::setValue(const string& key,const string& Value) {if (props->find(key) == props->end()){this->props->insert(make_pair(key, Value));}else{props->at(key) = Value;}std::ofstream outFile(this->config_path);for (const auto& pair : *props) {outFile << pair.first << " = " << pair.second << std::endl;}return true;
}

example.properties 示例代码

key1 = value1
key3 = value3
key5 = aaa
log.key4 = value4

运行例子:

#include "properties.h"
main(){std::string configPaht = "example.properties"Circle::properties properties;properties.file(configPaht);//判断配置文件是否存在if(properties.is_exists()){//读取配置文件写入props,keysproperties.load();//读取键值,如果不存在就返回默认值defaultValueproperties.getValue("key5","defaultValue");//设置键值并写入文件properties.setValue("key5","aaa");}
}

参考文章

C++读取Properties的工具类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重写muduo之TcpConnection

目录 1、 TcpConnection.h 2、 TcpConnection.cc 1、 TcpConnection.h TcpConnection底层绑定&#xff08;管理&#xff09;了一个Channel&#xff0c;Channel有事件被Poller通知后&#xff0c;会调用相应的回调&#xff0c;这些回调也是TcpConnection中包含的方法&#xff0c…

泰达克仿钻点水晶饰品包装印刷防滑UV胶特性及应用场景

仿钻点UV滴胶是一种特殊的胶水 常用于模拟钻石的效果 它是一种透明的胶水 具有高光泽度和折射率 可以在物体表面形成类似钻石的亮闪效果 仿钻点UV滴胶通常由紫外线固化胶组成 需要通过紫外线照射来固化和硬化 它具有以下特点&#xff1a; 1. 透明度&#xff1a;仿钻点UV滴胶具有…

AndroidStudio中如何配置共享变量,以便于方便配置共享

文章目录 一、定义共享变量二、引入通用配置三、在Module中使用这个通用配置 Android studio Gradle配置通用配置 在使用Android studio Android开发中Gradle通常会遇到很多相同的配置例如在不同的module中都要配置相同的compileSdkVersion、buildToolsVersion等 这时我们可以…

BGP第二篇(bgp邻居状态及影响邻居建立的因素)

1、bgp邻居状态 BGP对等体的交互过程中存在6种状态机&#xff1a; 空闲&#xff08;Idle&#xff09; 连接&#xff08;Connect&#xff09; 活跃 &#xff08;Active&#xff09; Open报文已发送&#xff08;OpenSent&#xff09; Open报文已确认&#xff08;OpenConfirm&…

代码-功能-Python-运用bs4技术爬取汽车之家新闻信息

第三方库安装指令&#xff1a; pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple pip install BeautifulSoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple 运行代码&#xff1a; #这个代码并不完整&#xff0c;有很大的问题&#xff0c;但目前不知道怎么…

docker八大架构之单机架构

单机架构 什么是单机架构&#xff1f; 单机架构指的是应用服务和数据库服务公用同一台服务器。如下边两个图所示&#xff0c;当我们进行购物时&#xff0c;所有的物品信息和用户信息都是在同一个服务器下进行运行的&#xff0c;之所以称为单机架构就是因为它所有的操作是在同…

【JavaScript】深入了解 JavaScript 函数

序言 在 JavaScript 中&#xff0c;函数是一种强大的工具&#xff0c;它允许我们封装代码、实现逻辑复用&#xff0c;并且在需要时进行调用。本文将深入探讨 JavaScript 函数的各个方面&#xff0c;包括定义函数、函数调用、返回值、作用域、参数以及 ES6 中的箭头函数等内容。…

Vue3+Element+TS动态菜单+按钮权限控制实现探索

1.动态获取权限并根据获取权限转换成相对应的router 根据请求获取菜单数据&#xff0c;对菜单数据进行转换&#xff0c;分别进行下面几步&#xff1a; /*** 组件地址前加斜杠处理*/ export function addSlashToRouteComponent(routeList: AppRouteRecordRaw[]) {routeList.fo…

如何创建族表

https://jingyan.baidu.com/article/c275f6bafa5714a23c756768.html

五角钱的程序员 | Kafka 是什么?

本文来源公众号“五角钱的程序员”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Kafka 是什么&#xff1f; 你是一个程序员&#xff0c;假设你维护了两个服务 A 和 B。B 服务每秒只能处理 100 个消息&#xff0c;但 A 服务却每秒…

数据结构·一篇搞定栈!

好久不见&#xff0c;超级想念 废话不多说&#xff0c;直接看 引言 在数据结构的大家族中&#xff0c;栈&#xff08;Stack&#xff09;是一种非常重要的线性数据结构&#xff0c;它的特点是后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;。栈在程序设…

Echarts旭日图的配置项,强大的层级关系展示图表。

ECharts中的旭日图&#xff08;Sunburst Chart&#xff09;是一种数据可视化图表&#xff0c;用于展示层级关系数据。它通常用于呈现树状结构或层级结构的数据&#xff0c;例如组织结构、文件目录结构、地理区域层级等。 旭日图通过圆形的方式展示数据的层级结构&#xff0c;每…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout 文章编号&…

算法day01

1、[283.移动零](https://leetcode.cn/problems/move-zeroes/) 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 解题思路&#xff1a; 双指针…

Redis——入门简介

Redis&#xff0c;全称为Remote Dictionary Server&#xff0c;即远程字典服务&#xff0c;是一个开源的、内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件&#xff0c;具备出色的读写性能和丰富的功能特性。以下是对Redis的入门简介&#xff1a; 一、Redis的主…

LVM逻辑卷管理之快照 —— 筑梦之路

简介 LVM快照是LVM提供的一个强大功能&#xff0c;它允许我们在不中断服务的情况下捕获逻辑卷在某个时间点的状态&#xff0c;从而进行备份、恢复或测试等操作。LVM快照是一个特殊的逻辑卷&#xff0c;它保存了原始逻辑卷在某个时间点的数据镜像。快照使用写时复制&#xff08…

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是&#xff1f; 实际利润目标利润&#xff08;目标成本-实际成本&#xff09;*卖方分担比例 解&#xff1a;10 000&#xff08;100 000 - 90 000&#xff09;* 0.2 12 000&#xff08;元&#xff09; 实际成本有时也写作最终成本&#xff0c;问承…

Ubuntu 24.04 LTS 安装 touchegg 开启触控板多指手势

文章目录 〇、概述一、安装 touchegg二、安装 gnome-shell 扩展 X11 Gestures三、安装可视化配置工具 touche 〇、概述 之前为了让笔记本支持多指手势&#xff0c;我安装的是 fusuma&#xff0c;安装教程详见 这篇文章 &#xff0c;考虑到 fusuma 安装过程繁琐且不支持可视化配…

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…

linux 设备驱动支持多个设备写法

compatible “aaa,bbb” 当一个驱动支持多个设备的时候&#xff0c;在每个设备的dts中&#xff0c;都会配置各自的compatible&#xff0c;当与driver中的compatible匹配后&#xff0c;会取各自的data。在 __of_match_node中有match。 Example1 static const struct of_devi…