嵌入式大杂烩周记 | 第 10 期-程序员宅基地

技术标签: c++  java  c语言  json  嵌入式  

大家好,我是杂烩君。

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

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

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格式。

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

7f861292774c16fe313261168b24e49a.png

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

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

12c425e11e7026ad95d3ca87f74195e0.png

同时,新建一个 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)是把字符串转换成整型数的一个函数。

编译、运行:

2d46c669e7bb74cf17e3f93146662eb5.png

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

咱们下期见~

猜你喜欢:

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

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

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

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

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

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

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

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhengnianli/article/details/124185590

智能推荐

博士计算机毕业论文格式,博士毕业论文格式类型要求-程序员宅基地

文章浏览阅读371次。一、毕业论文格式及要求1.毕业论文格式一般说来,一篇毕业论文要具备相对固定的格式。这些提到的毕业论文格式仅供参考。学校有具体规定的,则按规定办。这里以文件中规定的毕业论文格式为准。①论文题目,有的含副标题。题目之下是作者署名,署名之前或下边一行写作者的校、院、系、年级。②“摘要”与“关键词”(或称“内容提要”),一般为300字左右。位于作者署名之后,正文之前。关键词,结合标题和正文内容一般选取3至..._国外博士毕业论文字数

R桑基图_r 画桑基图-程序员宅基地

文章浏览阅读8.7k次,点赞6次,收藏16次。哈哈哈哈搞定桑基图了!_r 画桑基图

spring整合mybatis动态切换数据源+事务管理_mybatis 在事务中 切换数据源1146-程序员宅基地

文章浏览阅读1.4k次。*公司因为业务需要,需要把同一份服务的数据根据不同标识分别存放到两个数据库中(数据结构一样),刚开始为了尽快满足需求,使用了个简版(代码切换数据源),闲下来以后实在觉得太low,查看了一些demo以后,整理出来了适合自己项目的配置。话不多说,上步骤。*..._mybatis 在事务中 切换数据源1146

安装VueCLI的时候碰到的了这个,求教_this version has been deprecated and is no longer -程序员宅基地

文章浏览阅读4.3k次。npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintainednpm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintainednpm WARN deprecated har-valida_this version has been deprecated and is no longer supported or maintained

2012九月十月腾讯,网易游戏,百度最新校园招聘笔试题_有一个箱子和n把钥匙 k-程序员宅基地

文章浏览阅读4.8k次。十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题)引言 此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网易游戏,百度等各大公司最新校园招聘的笔试题,后续将继续整理十月下旬的笔/面试题。腾讯2011.10.15校园招聘会笔试题1、下面的排序算法中,初始数据集的排列顺序对算法的性能无_有一个箱子和n把钥匙 k

NLP 简介_大数据nlp是什么-程序员宅基地

文章浏览阅读790次。NLP技术的发展为人类语言处理应用带来了巨大的潜力,在智能客服、语音助手、自然语言搜索等方面都有着重要的应用。词法分析涉及对文本中的词和词组进行识别和分类,句法分析涉及对句子的结构进行分析,语义分析涉及对句子的意思进行理解。总的来说,NLP是自然语言处理的研究的基础,它涵盖了词法分析、句法分析、语义分析等各个方面。分词是将文本分解为单独的词的过程,词干提取是将词的不同形式转换为基本形式的过程,词性标注是为每个词标记词性的过程。最后,还有一类叫做自然语言理解的技术,它是语音识别、自然语言搜索等应用的基础。_大数据nlp是什么

随便推点

Android NDK开发轻松入门-程序员宅基地

文章浏览阅读596次。简介:AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合。注意:AndroidNDK只能用于Android1.5及以上版本中。I. Android NDK目标:Android虚拟机允许你的应用在源码中通过JNI调用本地代码(c/c++)中实现的方法们。概括起来,这表示:--你的应用的

ElasticSearch 7.6.2 索引填加字段并设置默认值_elasticsearch 索引增加字段默认值-程序员宅基地

文章浏览阅读4.2k次。ElasticSearch 7.6.2 索引填加字段并设置默认值因为 es 索引结构特性当我们对现有索引新增字段时并不会影响历史数据,并且如果没有写入这个字段值时,也不会有默认值所以有时我们需要对历史数据设置默认值1. 使用 put 方法加字段PUT my_index/_mapping{ "properties": { "字段":{ "type": "类型" } }}2. 设置默认值使用 postPOST my_index/_update_by_quer_elasticsearch 索引增加字段默认值

Flutter插件(Plugin)开发 - Android视角-程序员宅基地

文章浏览阅读841次,点赞21次,收藏28次。为了方便有学习需要的朋友,我把资料都整理成了视频教程(实际上比预期多花了不少精力)当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

解决只有jar包但没有其它相关maven文件时项目无法读取问题_maven有jar包却不能识别-程序员宅基地

文章浏览阅读1.4k次。由于oracle的部分jar包在maven的中央仓库中没有这个资源,只能通过配置本地库才能加载到项目中去,而此时手里只有一个``com.springsource.oracle.jdbc-11.2.0.4.jar``包,直接在maven仓库创建对应的目录放进去,发现项目还是读取不到。_maven有jar包却不能识别

Mac检出svn checkout报错 svn: E200030: SQLite 编译为 3.39.5,但是运行于 3.39.4_svn: e200030: sqlite compiled for 3.39.5, but runn-程序员宅基地

文章浏览阅读437次。然后我把sqlite升级至最新版本, brew upgrade sqlite。升级到最新版本之后,将svn重装。一开始我在mac上装好svn之后,尝试 svn sheckout ,结果他一直报错 svn: E200030。安装最新版本:brew install subversion。卸载:brew uninstall subversion。反复将sqlite和svn重装几次,还是不行。重装系统之后,搞定OK。_svn: e200030: sqlite compiled for 3.39.5, but running with 3.39.4

IntelliJ -IDEA插件开发教程-UI篇-编辑提示、消息通知(五)_idea plugin ui-程序员宅基地

文章浏览阅读3.8k次。核心实现类1.创建多选项弹框1. 实现效果2. 具体实现步骤创建 调用 添加完整源码public class HelloIdeaPlugin extends AnAction { @Override public void actionPerformed(AnActionEvent e) { Application.project = e.getProject(); Editor data = e.getData(La_idea plugin ui

推荐文章

热门文章

相关标签