当前位置:首页 > C > 正文

C语言轻松解析INI配置文件(inih库详细使用教程)

在嵌入式开发、桌面应用或系统工具中,我们经常需要读取配置文件。INI 文件因其结构简单、易于阅读而被广泛使用。对于 C 语言开发者来说,inih 库(也称为 INI Not Invented Here)是一个非常轻量、高效且易于集成的开源库,专门用于解析 INI 格式的配置文件。

本文将手把手教你如何在 C 项目中使用 inih 库 来读取和处理 INI 配置文件,即使你是编程新手也能轻松上手!

C语言轻松解析INI配置文件(inih库详细使用教程) inih库 C语言解析INI文件 inih使用教程 轻量级INI解析器 第1张

什么是 inih 库?

inih 是一个用纯 C 编写的单文件 INI 解析器,体积小(仅几百行代码)、无外部依赖、线程安全,并支持标准 INI 语法(包括节 [section]、键值对 key=value、注释等)。它非常适合资源受限的环境,比如嵌入式系统。

它的核心函数是 ini_parse(),通过回调机制将解析到的每个键值对传递给用户自定义的处理函数。

第一步:获取 inih 库

你可以从 GitHub 官方仓库下载:https://github.com/benhoyt/inih

只需要两个文件:

  • ini.h —— 头文件
  • ini.c —— 实现文件

将这两个文件复制到你的 C 项目目录中即可。

第二步:编写 INI 配置文件

假设我们要读取一个名为 config.ini 的配置文件,内容如下:

[database]host = localhostport = 3306username = adminpassword = secret123[server]ip = 192.168.1.100port = 8080enable_ssl = true

第三步:编写 C 程序解析 INI 文件

我们需要实现一个回调函数,每当 inih 解析到一个键值对时,就会调用这个函数。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include "ini.h"// 定义结构体存储配置typedef struct {    char db_host[64];    int db_port;    char db_user[32];    char db_pass[32];        char srv_ip[16];    int srv_port;    int ssl_enabled;} config_t;// 回调函数:处理每个键值对static int handler(void* user, const char* section, const char* name,                   const char* value){    config_t* pconfig = (config_t*)user;    #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0    if (MATCH("database", "host")) {        strncpy(pconfig->db_host, value, sizeof(pconfig->db_host) - 1);    } else if (MATCH("database", "port")) {        pconfig->db_port = atoi(value);    } else if (MATCH("database", "username")) {        strncpy(pconfig->db_user, value, sizeof(pconfig->db_user) - 1);    } else if (MATCH("database", "password")) {        strncpy(pconfig->db_pass, value, sizeof(pconfig->db_pass) - 1);    } else if (MATCH("server", "ip")) {        strncpy(pconfig->srv_ip, value, sizeof(pconfig->srv_ip) - 1);    } else if (MATCH("server", "port")) {        pconfig->srv_port = atoi(value);    } else if (MATCH("server", "enable_ssl")) {        pconfig->ssl_enabled = (strcmp(value, "true") == 0 ||                                strcmp(value, "1") == 0);    } else {        return 0;  // 未知的 section/name,忽略    }    return 1; // 成功处理}int main(){    config_t config = {0}; // 初始化为零    // 调用 inih 解析器    if (ini_parse("config.ini", handler, &config) < 0) {        printf("无法打开配置文件 'config.ini'\n");        return 1;    }    // 打印解析结果    printf("=== 数据库配置 ===\n");    printf("Host: %s\n", config.db_host);    printf("Port: %d\n", config.db_port);    printf("User: %s\n", config.db_user);    printf("\n=== 服务器配置 ===\n");    printf("IP: %s\n", config.srv_ip);    printf("Port: %d\n", config.srv_port);    printf("SSL 启用: %s\n", config.ssl_enabled ? "是" : "否");    return 0;}

第四步:编译并运行

在终端中执行以下命令编译程序(假设主文件为 main.c):

gcc main.c ini.c -o myapp

然后运行:

./myapp

输出结果应为:

=== 数据库配置 ===Host: localhostPort: 3306User: admin=== 服务器配置 ===IP: 192.168.1.100Port: 8080SSL 启用: 是

常见问题与技巧

  • 路径问题:确保 config.ini 在程序运行目录下,或使用绝对路径。
  • 中文支持:inih 默认使用 ASCII/UTF-8,若需中文请确保文件编码正确。
  • 错误处理ini_parse 返回值:0 表示成功,-1 表示文件打不开,正数表示出错的行号。

总结

通过本教程,你已经掌握了如何使用 C语言解析INI文件inih库。这个 轻量级INI解析器 不仅简单易用,而且性能优异,非常适合各种 C 项目。无论你是开发嵌入式设备还是桌面工具,inih 都能帮你轻松管理配置。

现在就去试试吧!你也可以将此 inih使用教程 收藏起来,作为日后开发的参考。