嵌入式大杂烩周记 | 第 10 期

Posted 嵌入式大杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式大杂烩周记 | 第 10 期相关的知识,希望对你有一定的参考价值。

大家好,我是杂烩君。

嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。

内容主要来源于我们之前收集的资料:

https://gitee.com/zhengnianli/EmbedSummary

本期主角:inih

inih:一个C 语言编写的 INI 文件解析器。配置文件的格式有很多,如JSON、INI等。

JSON之前分享过了:例说嵌入式实用知识之JSON数据

本次我们使用inih解析器对ini格式配置文件的解析。

inih解析器源码地址:

作者:benhoyt

链接:https://github.com/benhoyt/inih

inih的使用

.ini 文件是 Initialization File 的缩写,即初始化文件。INI文件由节、键、值组成,注解使用分号表示(;)。例如:

[Section1 Name]
KeyName1_1=value1_1  ;这是注释
KeyName1_2=value1_2
[Section2 Name]
KeyName2_1=value2_1
KeyName2_2=value2_2

之前分享的嵌入式大杂烩周记 | 第 2 期:LLGUI中的配置文件也是INI格式。

从上面的源码仓库下载得到代码:

下面我们在我们的配置文件里记录IP等信息,应用代码解析INI配置文件得到IP并使用。

ini.cini.h 放到我们的工程下即可。这里我们使用一个测试工程:

同时,新建一个 ip.ini 文件存放于工程目录下。ip.ini 文件的内容如:

[ip]                ;Section1
ip_addr = 192.168.1.103

[test]              ;Section2
name = ZhengN       
num  = 66

下面我们编写代码test.c来解析这个文件:

// 微信公众号:嵌入式大杂烩
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ini.h"

typedef struct

    const char* ip_addr;
    const char* name;
    int num;
 configuration;

static int handler(void* user, const char* section, const char* name,
                   const char* value)

    configuration* pconfig = (configuration*)user;

    #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0
    if (MATCH("ip", "ip_addr")) 
    
        pconfig->ip_addr = strdup(value);
     
    else if (MATCH("test", "name")) 
    
        pconfig->name = strdup(value);
     
    else if (MATCH("test", "num")) 
    
        pconfig->num = atoi(value);
     
    else 
    
        return 0;  /* unknown section/name, error */
    

    return 1;


int main(int argc, char* argv[])

    configuration config;
    config.ip_addr = NULL;  /* set defaults */
    config.name = NULL;
    config.num = 0;

    if (ini_parse("ip.ini", handler, &config) < 0) 
    
        printf("Can't load 'ip.ini'\\n");
        return 1;
    
    printf("Config loaded from 'ip.ini': ip_addr = %s, name = %s, num = %d\\n",
        config.ip_addr, config.name, config.num);

    if (config.ip_addr)
        free((void*)config.ip_addr);
    if (config.name)
        free((void*)config.name);

    return 0;

解析方法很简单(可参考 inih/examples 下的demo,我们这里也是模仿这个demo来做解析的):

  • 构造一个配置结构体 configuration ,定义一个configuration结构体用于保存我们解析的数据,结构体里面的成员就是我们需要解析的INI文件里的各个键。例如,我们的ip.ini文件里有ip_addr、name、num这三个键,结构体里的成员表示的就是这三个键。

  • 定义一个handler回调函数,用于处理解析过程。解析过程也很简单,匹配Section Name及Key Name,然后取出值即可。

  • 调用 ini_parse 函数对INI文件进行解析。

其中,handler函数里调用了一个 strdup() 函数及 atoi() 函数。

  • strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现,,因为strdup()在内部调用了malloc()函数为变量分配内存。

  • atoi()函数(ascii to integer)是把字符串转换成整型数的一个函数。

编译、运行:

如果觉得文章有帮助,麻烦帮忙点赞、收藏、转发,谢谢!

咱们下期见~

猜你喜欢:

给媳妇讲解热电分离铜基板

嵌入式大杂烩周记 | 第 8 期 AMetal

嵌入式大杂烩周记 | 第 7 期 zlog

嵌入式大杂烩周记 | 第 6 期 FlexibleButton

嵌入式大杂烩周记 | 第 5 期 smartlink

嵌入式大杂烩周记 | 第 4 期 cola_os

嵌入式大杂烩周记 | 第 3 期 sys/queue.h

嵌入式大杂烩周记 | 第 2 期 llgui

嵌入式大杂烩周记 | 第 1 期 gear-lib

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。

创作挑战赛 新人创作奖励来咯,坚持创作打卡瓜分现金大奖

以上是关于嵌入式大杂烩周记 | 第 10 期的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式大杂烩周记 | 第 4 期

嵌入式大杂烩周记 | 第 6 期

嵌入式大杂烩周记 | 第 3 期

嵌入式大杂烩周记 | 第 9 期

嵌入式大杂烩周记 | 第 14 期

嵌入式大杂烩周记 | 第 14 期