C解析config
#cat bb.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#define KEYVALLEN 100
/* Delete left side blank */
char * l_trim(char * szOutput, const char *szInput)
{
assert(szInput != NULL);
assert(szOutput != NULL);
assert(szOutput != szInput);
for(NULL; *szInput != '\0' && isspace(*szInput); ++szInput){
;
}
return strcpy(szOutput, szInput);
}
/* Delete right side blank */
char *r_trim(char *szOutput, const char *szInput)
{
char *p = NULL;
assert(szInput != NULL);
assert(szOutput != NULL);
assert(szOutput != szInput);
strcpy(szOutput, szInput);
for(p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p){
;
}
*(++p) = '\0' ;
return szOutput;
}
/* Delete both side blank */
char * a_trim(char * szOutput, const char * szInput)
{
char *p = NULL;
assert(szInput != NULL);
assert(szOutput != NULL);
l_trim(szOutput, szInput);
for (p = szOutput + strlen(szOutput) - 1;p >= szOutput && isspace(*p); --p){
;
}
*(++p) = '\0';
return szOutput;
}
int GetProfileString(char *profile, char *AppName, char *KeyName, char *KeyVal )
{
char appname[32],keyname[32];
char *buf,*c;
char buf_i[KEYVALLEN], buf_o[KEYVALLEN];
FILE *fp;
int found=0; /* 1 AppName 2 KeyName */
if((fp=fopen( profile, "r"))==NULL){
printf("openfile [%s] error [%s]\n", profile, strerror(errno));
return(-1);
}
fseek(fp, 0, SEEK_SET );
memset(appname, 0, sizeof(appname) );
sprintf(appname, "[%s]", AppName );
while(! feof(fp) && fgets( buf_i, KEYVALLEN, fp )!=NULL){
l_trim(buf_o, buf_i);
if( strlen(buf_o) <= 0 )
continue ;
buf = NULL;
buf = buf_o;
if(found == 0){
if( buf[0] != '[' ) {
continue ;
} else if (strncmp(buf,appname, strlen(appname))==0){
found = 1;
continue;
}
} else if( found == 1 ) {
if (buf[0] == '#') {
continue ;
} else if ( buf[0] == '[' ) {
break;
} else {
if( (c = (char *) strchr(buf, '=')) == NULL )
continue ;
memset( keyname, 0, sizeof(keyname) );
sscanf(buf, "%[^=|^ |^\t]", keyname);
if(strcmp(keyname, KeyName) == 0 ) {
sscanf( ++c, "%[^\n]", KeyVal);
char *KeyVal_o = (char *) malloc(strlen (KeyVal) + 1);
if(KeyVal_o != NULL) {
memset(KeyVal_o, 0, sizeof(KeyVal_o));
a_trim(KeyVal_o, KeyVal);
if(KeyVal_o && strlen(KeyVal_o) > 0)
strcpy(KeyVal, KeyVal_o);
free(KeyVal_o);
KeyVal_o = NULL;
}
found = 2;
break;
} else {
continue ;
}
}
}
}
fclose (fp);
if (found == 2 )
return(0);
else
return(-1);
}
void main()
{
char ip[16];
char dev[10];
GetProfileString("./bb.txt", "cls_server", "ip", ip);
GetProfileString("./bb.txt", "device", "dev", dev);
printf("%s\n", ip);
printf("%s\n", dev);
}
#cat bb.txt
[cls_server]
#配置文件等号左右可以有空格也可以没有
ip=192.16.31.2
[device]
dev=sda
C解析config的更多相关文章
- 解析config文件 练手代码
解析一个如下的CONFIG文件 #config.txt #SHTTPD Web 服务器配置文件示例 #侦听端口 ListenPort = 80 #最大并发访问客户端数目 MaxClient = 8 # ...
- Mybatis学习笔记2 - 解析config
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- TypeSafe Config使用
================typesafeconfig的使用==================== #1.加入依赖包 config-1.2.1.jar #2.加载配置 ConfigFactor ...
- Git原理入门解析
前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的: 一.Git 简介 Git 是当前流行的分布式 ...
- 深入Mybatis源码——配置解析
@ 目录 前言 正文 配置解析 1. cacheRefElement/cacheElement 2. resultMapElements 3. sqlElement 4. buildStatement ...
- 探讨webapp的SEO难题(上)
前言 网络蜘蛛无法解析javascript,至少百度是不能的,神马搜索差的更远,而我们的webapp的渲染展示完全由javascript驱动 所以蜘蛛访问webapp页面会得到一个白页面,比如,我们期 ...
- Selenium自动化测试框架介绍
Selenium自动化测试框架介绍 1.测试架构作用 a.可维护性 b.提高编写脚本效率 c.提高脚本的可读性 2.框架的几大要素: Driver管理,脚本,数据,元素对象,LOG,报告,运行机制,失 ...
- Linux内核配置机制(make menuconfig 、Kconfig、Makefile)讲解【转】
本文转载自:http://www.codexiu.cn/linux/blog/34801/ 前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式—— ...
- [Python][flask][flask-wtf]关于flask-wtf中API使用实例教程
简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(Install) 此文仍然是Windows操作系统下的教程,但是和linux操作系统下的运行环境 ...
随机推荐
- vmware里面的linux怎么和windows相互传文件
我们常常遇到这样的问题.高版本号的vmware遇到低版本号的linux.使用起来就比較抠脚,比方低版本号的linux安装在高版本号的vmware里. 1.不能全屏显示虚拟机 2.每次切换出来.总要按一 ...
- CSS垂直居中完美有用实例
<!DOCTYPE HTML> <html> <head> <meta meta chars ...
- 如何删除 mac 系统信息下的安装记录
方法:在finder中:Command+Shift+G 打开 /Library/Receipts/InstallHistory.plist 所有的记录都在 InstallHistory.plist 文 ...
- c++中读写文件操作
读写文件这个,不常用,每次用的时候都会百度一下,每次写法还都不一样,所有总是记混.今天利用点时间总结下之前工程中用过的.以后就安照这种方法写了. 搞acmicpc的时候喜欢用freopen(),这个是 ...
- 最直观的poi的使用帮助(告诉你怎么使用poi的官网),操作word,excel,ppt
最直观的poi的使用帮助(告诉你怎么使用poi的官网),poi操作word,excel,ppt 写在最前面 其实poi的官网上面有poi的各种类和接口的使用说明,还有非常详细的样例,所以照着这些样例来 ...
- RDA 升级
烧录BOOT升级方式: 1.连接 2.烧录BOOT 1)升级“bootrom_raw.bin” 99K,这种升级方式需要Tera Term 工具,按“F5” U盘升级. 编译的升级文件“RR8503 ...
- 【转载】基于AFNetWorking3.0的图片缓存分析
原文出处: Yasin的简书 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.CoreData…).我们常说的网络请求缓存包 ...
- JavaScript中.和[]有什么区别?
.与[]都可以用于读取或修改对象属性. <script> var myData={ name:"Adam", weather:"sunny", }; ...
- Linux命令(004) -- watch
对Linux系统的操作过程中,经常会遇到重复执行同一命令,以观察其结果变化的情况.惯用的方法是:上下键加回车,或是Ctr+p然后回车.今天我们来了解一下watch命令,它可以帮助我们周期性的执行一个命 ...
- 解决Sql中DIstinct与Order By共同使用的冲突问题
1.需求场景: 需要把最新更新文章的前五名作者展示出来. 2.解决问题第一步: select top 5 creator from table order by updateDate desc 结果: ...