大家好,我是杂烩君。
嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。
内容主要来源于我们之前收集的资料:
https://gitee.com/zhengnianli/EmbedSummary
inih:一个C 语言编写的 INI 文件解析器。配置文件的格式有很多,如JSON、INI等。
JSON之前分享过了:例说嵌入式实用知识之JSON数据
本次我们使用inih解析器对ini格式配置文件的解析。
inih解析器源码地址:
作者:benhoyt
链接:https://github.com/benhoyt/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.c
与 ini.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 ,可查看文章汇总。
文章浏览阅读371次。一、毕业论文格式及要求1.毕业论文格式一般说来,一篇毕业论文要具备相对固定的格式。这些提到的毕业论文格式仅供参考。学校有具体规定的,则按规定办。这里以文件中规定的毕业论文格式为准。①论文题目,有的含副标题。题目之下是作者署名,署名之前或下边一行写作者的校、院、系、年级。②“摘要”与“关键词”(或称“内容提要”),一般为300字左右。位于作者署名之后,正文之前。关键词,结合标题和正文内容一般选取3至..._国外博士毕业论文字数
文章浏览阅读8.7k次,点赞6次,收藏16次。哈哈哈哈搞定桑基图了!_r 画桑基图
文章浏览阅读1.4k次。*公司因为业务需要,需要把同一份服务的数据根据不同标识分别存放到两个数据库中(数据结构一样),刚开始为了尽快满足需求,使用了个简版(代码切换数据源),闲下来以后实在觉得太low,查看了一些demo以后,整理出来了适合自己项目的配置。话不多说,上步骤。*..._mybatis 在事务中 切换数据源1146
文章浏览阅读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
文章浏览阅读4.8k次。十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题)引言 此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网易游戏,百度等各大公司最新校园招聘的笔试题,后续将继续整理十月下旬的笔/面试题。腾讯2011.10.15校园招聘会笔试题1、下面的排序算法中,初始数据集的排列顺序对算法的性能无_有一个箱子和n把钥匙 k
文章浏览阅读790次。NLP技术的发展为人类语言处理应用带来了巨大的潜力,在智能客服、语音助手、自然语言搜索等方面都有着重要的应用。词法分析涉及对文本中的词和词组进行识别和分类,句法分析涉及对句子的结构进行分析,语义分析涉及对句子的意思进行理解。总的来说,NLP是自然语言处理的研究的基础,它涵盖了词法分析、句法分析、语义分析等各个方面。分词是将文本分解为单独的词的过程,词干提取是将词的不同形式转换为基本形式的过程,词性标注是为每个词标记词性的过程。最后,还有一类叫做自然语言理解的技术,它是语音识别、自然语言搜索等应用的基础。_大数据nlp是什么
文章浏览阅读596次。简介:AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合。注意:AndroidNDK只能用于Android1.5及以上版本中。I. Android NDK目标:Android虚拟机允许你的应用在源码中通过JNI调用本地代码(c/c++)中实现的方法们。概括起来,这表示:--你的应用的
文章浏览阅读4.2k次。ElasticSearch 7.6.2 索引填加字段并设置默认值因为 es 索引结构特性当我们对现有索引新增字段时并不会影响历史数据,并且如果没有写入这个字段值时,也不会有默认值所以有时我们需要对历史数据设置默认值1. 使用 put 方法加字段PUT my_index/_mapping{ "properties": { "字段":{ "type": "类型" } }}2. 设置默认值使用 postPOST my_index/_update_by_quer_elasticsearch 索引增加字段默认值
文章浏览阅读841次,点赞21次,收藏28次。为了方便有学习需要的朋友,我把资料都整理成了视频教程(实际上比预期多花了不少精力)当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
文章浏览阅读1.4k次。由于oracle的部分jar包在maven的中央仓库中没有这个资源,只能通过配置本地库才能加载到项目中去,而此时手里只有一个``com.springsource.oracle.jdbc-11.2.0.4.jar``包,直接在maven仓库创建对应的目录放进去,发现项目还是读取不到。_maven有jar包却不能识别
文章浏览阅读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
文章浏览阅读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