您的位置:首页 > 运维架构 > Linux

Linux C实现小项目配置文件读取

2016-05-03 09:45 796 查看
/*************************************************************************
> File Name: Cfg.h
> Author: zhoulin
> Created Time: Wed 16 Mar 2016 06:17:27 PM CST
************************************************************************/
项目需要,有时候需要读取配置文件,大多以kv的方式。该小程序仅仅是读取字符,控制字符和空白行,空白字符是不读取的。
#ifndef _Cfg_H
#define WORD "="
typedef struct _Item
{
void *K;
void *V;
struct _Item *Next;
}Item;
typedef struct _Node
{
int Size;
char *Base;
struct _Node *Next;
struct _Item *iHead;
}Node;
typedef struct _Cfg
{
int Size;
struct _Node *nHead;
}Cfg;
Cfg *CfgNew(const char *path);
Node *GetNodeByBase(char *base,Cfg *cfg);
char  *GetValByKey(char *base,char *key,Cfg *Cfg);
int CfgFree(Cfg *cfg);
#define _Cfg_H
#endif


/*************************************************************************
> File Name: Cfg.c
> Author: zhoulin
> Created Time: Wed 16 Mar 2016 06:31:46 PM CST
************************************************************************/

#include "cfg.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define bufSize  1024
char *trimSp(char *buf)
{
char tbuf[bufSize] = {'\0'};
if(buf == NULL || strlen(buf) ==0)
{
return NULL;
}
int len = strlen(buf);
int i = 0, j =0;
while(i < len)
{
if(iscntrl(buf[i]) ==0 && isspace(buf[i]) ==0)
{
tbuf[j] = buf[i];
j++;
}
i++;
}
memset(buf,'\0',len);
strncpy(buf,tbuf,strlen(tbuf));
return buf;
}
int getPos(char *buf)
{
if(buf == NULL || strlen(buf) == 0)
{
return -1;
}
int len = strlen(buf);
int i = 0;
while(i < len)
{
if(buf[i] == '='){
break;
}
i++;
}
return i++;
}
Cfg *CfgNew(const char *path)
{
Cfg *cfg = NULL;
if(path == NULL || strlen(path) == 0)
{
return NULL;
}
FILE *fp = fopen(path,"r");
char buf[bufSize] = {'\0'};
if(fp == NULL)
{
return NULL;
}
cfg = (Cfg *)malloc(sizeof(*cfg));
while(fgets(buf,bufSize,fp) != NULL)
{
char *tbuf = trimSp(buf);
int pos = getPos(tbuf);
int len = strlen(tbuf);
if(len > 0 && len == pos  && tbuf[0] == '[' && tbuf[len-1] == ']')
{
Node *tmp = (Node *)malloc(sizeof(*tmp));
tmp->Base = (char *)malloc(len-1);
memset(tmp->Base,'\0',len-1);
strncpy(tmp->Base,tbuf+1,len-2);
if(cfg->nHead == NULL)
{
cfg->nHead  = tmp;
}else{
tmp->Next =cfg->nHead;
cfg->nHead = tmp;
}
cfg->Size++;
}else{
if(len > 0 && pos != len)
{
Node *h = cfg->nHead;
char *val = tbuf + pos+1;
tbuf[pos] = '\0';
char *key = tbuf;
int k_len = strlen(key);
int v_len = strlen(val);
Item *t = h->iHead;
if(t == NULL) {
t = (Item *)malloc(sizeof(*t));
h->iHead = t;
}else {
Item *cur = (Item *)malloc(sizeof(*cur));
cur->Next = h->iHead;
h->iHead = cur;
}
h->iHead->K = (char *)malloc(k_len+1);
h->iHead->V = (char *)malloc(v_len+1);
memset(h->iHead->K,'\0',k_len+1);
memset(h->iHead->V,'\0',v_len+1);
strncpy(h->iHead->K,key,k_len);
strncpy(h->iHead->V,val,v_len);
h->Size++;
}
}
memset(buf,'\0',bufSize);
}
if(fp != NULL){
fclose(fp);
}
if(cfg->Size == 0){
free(cfg);
cfg = NULL;
}
return cfg;
}
static void prtCfg(Cfg *m)
{
printf("cfg =%p,cfg->Size=%d\n",m,m->Size);
Node *cur = m->nHead;
while(cur != NULL)
{
printf("   -----cur node=%p,next =%p,base= %s[len=%d],size =%d\n",cur,cur->Next,\
cur->Base,strlen(cur->Base),cur->Size);
Item *icur = cur->iHead;
while(icur != NULL)
{
printf("        *******cur item=%p,next =%p,key[len=%d] = %s,val[len=%d] = %s\n",icur,icur->Next,\
strlen(icur->K),icur->K,strlen(icur->V),icur->V);
icur = icur ->Next;
}
cur = cur->Next;
}
}
Node *GetNodeByBase(char *base,Cfg *cfg)
{
Node *nv = NULL;
if(cfg == NULL) {
return nv;
}
Node *cur = cfg->nHead;
while(cur != NULL)
{
if(strncmp(cur->Base,base,strlen(cur->Base)) == 0)
{
nv = cur;
}
cur = cur->Next;
}
return nv;
}
char  *GetValByKey(char *base,char *key,Cfg *cfg)
{
char  *val = NULL;
if(cfg == NULL || cfg->Size <= 0){
return NULL;
}
Node *cur = cfg->nHead;
while(cur != NULL)
{
if(strncmp(cur->Base,base,strlen(cur->Base)) == 0)
{
Item *icur = cur->iHead;
while(icur != NULL)
{
if(strncmp(icur->K,key,strlen(icur->K)) == 0){
val = icur->V;
break;
}
icur = icur->Next;
}
}
cur = cur->Next;
}
return val;
}
int  CfgFree(Cfg *cfg)
{
if(cfg == NULL || cfg->Size ==0)
{
return -1;
}
Node *cur = cfg->nHead;
while(cur != NULL)
{
Item *icur = cur->iHead;
while(icur != NULL)
{
printf("        ******** free icur=%p,next=%p********\n",icur,icur->Next);
free(icur->K);
free(icur->V);
free(icur);
icur->K = icur->V = NULL;
icur = icur ->Next;
}
if(icur != NULL){
icur = NULL;
}
printf("******** free node=%p,next=%p********\n",cur,cur->Next);
free(cur->Base);
free(cur);
cur->Base =  NULL;
cur = cur->Next;
}
if(cur != NULL){
cur = NULL;
}
return 0;
}
int main(void)
{
Cfg *m = CfgNew("./test");
prtCfg(m);
char *v = GetValByKey("mysql","port",m);
Node *t = GetNodeByBase("tr",m);
if(t != NULL)
{
printf("%p,base =%s,size =%d\n",t,t->Base,t->Size);
Item *x = t->iHead;
while(x != NULL)
{
printf("cur = %p,next =%p,k=%s,v=%s\n",x,x->Next,x->K,x->V);
x = x->Next;
}
}
printf("v =%s\n",v);
char *v1 = GetValByKey("tr","bn",m);
printf("v1 =%s\n",v1);
printf("free =%d\n",CfgFree(m));
return 0;
}


运行结果:

测试的test文件:

[ ok ]
v1 =v2
k3 = v3
#k
#df
dddd
#[dd]
KK   #  D
KK = == V
[yu]
dgf = fd
[mysql]
user = root

port = 4450

#comment
t1  = vo
m2 == max
bn====m8


  

 

cfg =0x23da250,cfg->Size=4
-----cur node=0x23da5a0,next =0x23da490,base= tr[len=2],size =3
*******cur item=0x23da6b0,next =0x23da650,key[len=2] = bn,val[len=5] = ===m8
*******cur item=0x23da650,next =0x23da5f0,key[len=2] = m2,val[len=4] = =max
*******cur item=0x23da5f0,next =(nil),key[len=2] = t1,val[len=2] = vo
-----cur node=0x23da490,next =0x23da3e0,base= mysql[len=5],size =2
*******cur item=0x23da540,next =0x23da4e0,key[len=4] = port,val[len=4] = 4450
*******cur item=0x23da4e0,next =(nil),key[len=4] = user,val[len=4] = root
-----cur node=0x23da3e0,next =0x23da270,base= yu[len=2],size =1
*******cur item=0x23da430,next =(nil),key[len=3] = dgf,val[len=2] = fd
-----cur node=0x23da270,next =(nil),base= ok[len=2],size =3
*******cur item=0x23da380,next =0x23da320,key[len=2] = KK,val[len=3] = ==V
*******cur item=0x23da320,next =0x23da2c0,key[len=2] = k3,val[len=2] = v3
*******cur item=0x23da2c0,next =(nil),key[len=2] = v1,val[len=2] = v2
0x23da5a0,base =tr,size =3
cur = 0x23da6b0,next =0x23da650,k=bn,v====m8
cur = 0x23da650,next =0x23da5f0,k=m2,v==max
cur = 0x23da5f0,next =(nil),k=t1,v=vo
v =4450
v1 ====m8
******** free icur=0x23da6b0,next=0x23da650********
******** free icur=0x23da650,next=0x23da5f0********
******** free icur=0x23da5f0,next=(nil)********
******** free node=0x23da5a0,next=0x23da490********
******** free icur=0x23da540,next=0x23da4e0********
******** free icur=0x23da4e0,next=(nil)********
******** free node=0x23da490,next=0x23da3e0********
******** free icur=0x23da430,next=(nil)********
******** free node=0x23da3e0,next=0x23da270********
******** free icur=0x23da380,next=0x23da320********
******** free icur=0x23da320,next=0x23da2c0********
******** free icur=0x23da2c0,next=(nil)********
********


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: