前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >拿来即用的脚手架:INI文件

拿来即用的脚手架:INI文件

作者头像
程序员的园
发布于 2025-02-27 06:15:06
发布于 2025-02-27 06:15:06
6700
代码可运行
举报
运行总次数:0
代码可运行

您好,我是昊天,国内某头部音频公司的C++主程,多年的音视频开发经验,熟悉Qt、FFmpeg、OpenGL。

本文思路来源于读者交流群,某位读者朋友出一系列的拿来即用的脚手架,如INI文件的封装解析、JSON文件的封装解析、日志模块等,

为满足有同样问题的朋友们的需求,自本文开始将会开启脚手架系列文章,本文作为第一篇——从跨平台、易用性强的INI文件存取来深入分析,如果想进一步交流可进入交流内群获得源码(群二维码见后面)。

INI文件

INI文件(Initialization File)是一种简单的配置文件格式,广泛用于存储配置信息,尤其是在桌面应用程序和游戏中。它采用易于理解的文本格式,允许用户和程序设置各种参数,且通常不需要复杂的解析机制。INI文件通常分为多个节(Section),每个节包含多个键值对配置项。

书写格式格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
;全局数据
company=xxx

[General]
appname = MyApplication
version = 1.0.0
# 这是另一个注释
[UserSettings]
username = johndoe
language = en
theme = dark
  • [Section]表示,每个节下有多个key=value形式的配置项。
  • 注释以;#开头,程序在解析时会跳过这些行。
  • 配置文件支持简单的文本编辑,适合存储程序的配置信息。

INI文件广泛应用于配置管理,例如:

  • 程序设置:应用程序启动时读取INI文件以获取配置信息。
  • 用户设置:用户自定义的界面主题、语言等设置常常保存在INI文件中。
  • 跨平台配置:许多跨平台应用程序使用INI文件来管理不同操作系统上的配置信息。

INI“脚手架”

其实不敢妄谈“脚手架”,但是为了能够靠近“脚手架”的效果,期望满足如下需求:

  • 跨平台:支持WindowsLinux、macOS等主流操作系统;
  • 易用性:不仅要便于集成到项目中,而且要提供简洁的接口;
  • 功能全:支持解析、修改、保存INI文件;
    • 支持解析INI文件,需要识别节名、键值对,同时需要忽略注释行;
    • 支持获取和设置配置信息;
    • 支持保存修改后的配置项到文件中;

实现方案

  • 为满足跨平台,使用C++代码书写,不依赖于任何库或平台特定的API
  • 为满足易用性,使用cmake组织工程,并提供IniConfig.cmake文件,只需要在主工程中添加如下代码即可:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include("path/ini/IniConfig.cmake") # path为IniConfig.cmake文件所在路径
  • 为满足功能全,实现了一个IniConfig类,提供了如下接口
    • load函数:加载INI文件,解析节名、键值对,忽略注释行;
    • get函数:获取指定节名和键名对应的值;
    • set函数:设置指定节名和键名对应的值;
    • save函数:将修改后的配置项保存到INI文件中;

使用示例

使用该项目时,需要在主工程的CMakeLists.txt文件中添加对应的.cmake文件,主项目的CMakeLists.txt文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake_minimum_required(VERSION 3.16)
project(19_iniconfig)

add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/example/main.cpp)

# 需要在add_executable、add_library之后添加
# 引入ini配置文件,只需要这一句即可
include(${CMAKE_CURRENT_SOURCE_DIR}/ini/IniConfig.cmake)

主程序中使用IniConfig类的示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include "IniConfig.h"

void test_ini_save()
{
    INI::IniConfig config;
    config.set("UserSettings", "username", "newuser");
    config.set("UserSettings", "password", "newpassword");
    config.set("Database", "host", "newhost");
    config.set("Database", "port", "3306");

    config.set("", "global", "global");
    config.save("d://config.ini");
}

void test_ini_load()
{
    INI::IniConfig config;
    if (!config.load("d://config.ini"))
    {
        std::cout << "load failed" << std::endl;
    }
    
    std::string user_name, password, host, port, global, data;
    if (config.get("UserSettings", "username", user_name))
    {
        std::cout << user_name << std::endl;
    }

    if (config.get("Database", "host", host))
    {
        std::cout << host << std::endl;
    }

    if (config.get("", "global", global))
    {
        std::cout << global << std::endl;
    }
}

int main()
{
    test_ini_save();

    std::cout << "----------------------------" << std::endl;
    test_ini_load();

    return0;
}

总结

本文介绍了一个跨平台、易用性高的INI文件封装解析的脚手架项目,如果希望获取源码或者跟我深入讨论这个问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • INI文件
  • INI“脚手架”
    • 实现方案
    • 使用示例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档