前段时间看udhcpd的源代码,后来因为没直接应用,也就放弃了。网上有文章udhcpd详解(搜索一下有很多),其中在介绍udhcpd的配置相关代码时,有如下一句话,学习了这段代码后,以后用到需要读配置文件的地方可以直接使用。恰巧项目需要,就认真学习了下这段代码。不得不说,高人就是高人,写得代码简直是艺术品。我再做任何改动都毁了这件艺术品。我参看的源代码是udhcp-0.9.8。主要文件看的文件就是file.c,相关头文件就是file.h和dhcp.h。下面我贴我应用的代码,建议直接看源代码,我做一点注释。

  下面是.c文件。

 struct general_config_t g_general_config;

 static struct config_keyword keywords[] = {
/* keyword[14] handler variable address default[30] */
{"server_ip", read_str, &(g_general_config.server_ip), "192.168.1.50"},
{"my_id", read_str, &(g_general_config.my_id), "lt1000"},
{"position",read_str,&(g_general_config.my_positon),"not set position"},
{"", NULL, NULL, ""},
}; /***********************************************************************************************
*函数名 :read_str
*函数功能描述:关键字对应的参数为字符串
*函数参数 : 输入参数字符串,存储输入参数的地址
*函数返回值 : 1 成功返回1
*作者 : nelson
*函数创建日期 : 2015.12.09
*函数修改日期 : 尚未修改
*修改人 :尚未修改
*修改原因 : 尚未修改
*版本 : 1.0
*历史版本 : 无
***********************************************************************************************/
int read_str(char *line, void *arg)
{
char *dest = (char *)arg; //arg是指向数组首地址的地址 strcpy(dest,line); return ;
} /***********************************************************************************************
*函数名 :read_config
*函数功能描述:读配置文件
*函数参数 :file 配置文件文件名 相对路径或者绝对路径都可以
*函数返回值 :成功返回1 失败返回0
*作者 : nelson
*函数创建日期 : 2015.12.09
*函数修改日期 : 尚未修改
*修改人 :尚未修改
*修改原因 : 尚未修改
*版本 : 1.0
*历史版本 : 无
***********************************************************************************************/
int read_config(char *file)
{
FILE *in;
char buffer[], *token, *line;
int i; for (i = ; strlen(keywords[i].keyword); i++)
{
if (strlen(keywords[i].def))
keywords[i].handler(keywords[i].def, keywords[i].var);
} if (!(in = fopen(file, "r")))
{
Important_Printf("config file not found,using the default value!");
return ;
} while (fgets(buffer, , in))
{
if (strchr(buffer, '\n'))
*(strchr(buffer, '\n')) = '\0'; if (strchr(buffer, '#'))
*(strchr(buffer, '#')) = '\0'; token = buffer + strspn(buffer, " \t");
if (*token == '\0')
continue;
line = token + strcspn(token, " \t=");
if (*line == '\0')
continue;
*line = '\0';
line++; /* eat leading whitespace */
line = line + strspn(line, " \t=");
/* eat trailing whitespace */
for (i = strlen(line); i > && isspace(line[i - ]); i--);
line[i] = '\0'; for (i = ; strlen(keywords[i].keyword); i++)
{
if(!strcmp(token, keywords[i].keyword))
{
if (!keywords[i].handler(line, keywords[i].var))
{
keywords[i].handler(keywords[i].def, keywords[i].var);
}
}
}
} fclose(in); return ;
}

  然后是.h文件

 #define SERVER_IP_LEN 16
#define MY_ID_LEN 12
#define POSITION_STRING_LEN 30 #pragma pack(1)
struct config_keyword
{
char keyword[]; //关键字
int (*handler)(char *line, void *var); //关键字处理函数
void *var; //关键字对应的输入参数存储地址
char def[]; //关键字对应的输入参数默认值
};
#pragma pack() #pragma pack(1)
struct general_config_t //全局配置参数结构体
{
char server_ip[SERVER_IP_LEN]; /*save tcp server's ip*/
char my_id[MY_ID_LEN]; /*id of myself*/
char my_positon[POSITION_STRING_LEN]; /*meachine's positon*/
};
#pragma pack() extern struct general_config_t g_general_config; int read_str(char *line, void *arg);

   稍微需要讲的是config_keyword结构体,不得不说设计的真好。

   然后就是strchr、strspn、strcspn、isspace这几个字符串操作函数。认真看,就会发现,使用strspn和strcspn可以从未知字符串中提取出自己想要的字符串,很方便。

仿udhcpd配置文件读取的一段代码的更多相关文章

  1. vim移动一行或一段代码

    nmap <M-j> mz:m+<cr>`z nmap <M-k> mz:m-2<cr>`z vmap <M-j> :m'>+< ...

  2. 【Spring源码分析】配置文件读取流程

    前言 Spring配置文件读取流程本来是和http://www.cnblogs.com/xrq730/p/6285358.html一文放在一起的,这两天在看Spring自定义标签的时候,感觉对Spri ...

  3. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

  4. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)

    干了一天的活,还有点时间,给兄弟们写点东西吧. 大家有没有发现一个问题?那就是在.Net Core的MVC项目里面,没有.config文件了!!!同志们,没有config文件了啊,这样搞,我以后要做些 ...

  5. [spring源码学习]二、IOC源码——配置文件读取

    一.环境准备 对于学习源码来讲,拿到一大堆的代码,脑袋里肯定是嗡嗡的,所以从代码实例进行跟踪调试未尝不是一种好的办法,此处,我们准备了一个小例子: package com.zjl; public cl ...

  6. VS2012中,C# 配置文件读取 + C#多个工程共享共有变量 + 整理using语句

    (一) C# 配置文件读取 C#工程可以自动生成配置文件,以便整个工程可以使用设置的配置进行后续的处理工作. 1. 首先,右键工程文件-->Properties -->settings-- ...

  7. C 构造一个 简单配置文件读取库

    前言 最近看到这篇文章, json引擎性能对比报告 http://www.oschina.net/news/61942/cpp-json-compare?utm_source=tuicool 感觉技术 ...

  8. C# 配置文件读取与修改(转)

    C# 配置文件读取与修改   配置文件在很多情况下都使用到, 配置文件分为两种 一种是应用程序的配置文件, 一种是web的配置文件. 两种配置文件最大的区别是web的配置文件更新之后会实时更新, 应用 ...

  9. smarty 从配置文件读取变量

    smarty变量分3种: Variables [变量] Variables assigned from PHP [从PHP分配的变量] Variables loaded from config fil ...

随机推荐

  1. 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

    题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...

  2. BZOJ 2244 [SDOI2011]拦截导弹 ——CDQ分治

    三维偏序,直接CDQ硬上. 正反两次CDQ统计结尾的方案数,最后统计即可. #include <cstdio> #include <cstring> #include < ...

  3. 中国余数定理 2(codevs 3990)

    题目描述 Description Skytree神犇最近在研究中国博大精深的数学. 这时,Sci蒟蒻前来拜访,于是Skytree给Sci蒟蒻出了一道数学题: 给定n个质数,以及k模这些质数的余数.问: ...

  4. AC日记——租用游艇 洛谷 P1359

    题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1& ...

  5. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  6. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations

    得到k二进制后,对每一位可取得的方法进行相乘即可,k的二进制形式每一位又分为2种0,1,0时,a数组必定要为一长为n的01串,且串中不出现连续的11,1时与前述情况是相反的. 且0时其方法总数为f(n ...

  7. SpringCloud-Eureka注册中心

    什么是微服务,分布式? 分布式:不同的模块部署在不同的服务器上,可以更好的解决网站高并发. 微服务:架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异 ...

  8. ios Crash Log 分析汇总

    方法一: 1.xcode 有自带的symbolicatecrash,可以将.crash文件中的16进制地址转换成可读的函数地址. symbolicatecrash位于: /Applications/X ...

  9. WIN7实现多用户远程桌面

    版权声明:本文为博主原创文章,未经博主允许不得转载. 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://jonnyqin.blog. ...

  10. 电脑技巧 ADSL如何远程盗号

    ADSL如何远程盗号 开头语: 本文中揭露了黑客攻击ADSL用户,窃取用户名密码的常见方法,读者请勿将其用于不法用途,并提醒所有与此漏洞相关的用户尽快采取措施进行防范. ADSL作为一种宽带接入方式已 ...