自己编写的简单的配置文件的函数

//配置文件是指 ini 格式
//
#include <string.h> //for memset
#define SET_ARRAY_CLEAN(x) memset((x),0,sizeof(x))
typedef void* (*ArgHandleFunc)(void* arg,...);
ArgHandleFunc gDefaultHandler;
struct Handler
{
    //
    ArgHandleFunc m_handler;
    //指向具体参数结构体的指针
    void *m_pas;  //as: argument struct
} gp_Handler={gDefaultHandler,NULL};

int SetParamsByConfigFile(char *cfgfile,struct Handler *pHandler)
{     
    FILE *fp=fopen(cfgfile,"r");
    if (fp==NULL)
    {
        printf("无法打开指定的参数文件[%s],可能是文件不存在!\n",cfgfile);
        return -1; 
    }
    
    struct Handler *localHandler=()(0!=pHandler)? pHandler :&gp_Handler);
    
    char  gline[128]={0};
    char  pname[64]={0},pvalue[64]={0};
    int   lineTotal=0,readOK=0;
    while(feof(fp)==0)
    {
        if(0!=readOK)
        {
            ARRAY_SET_CLEAN(gline); 
            readOK=0;
        }
        if (fgets(gline,sizeof(gline),fp))
        {
            lineTotal++;
            readOK=1;
            if (gline[0]=='#'||gline[0]==';'||gline[0]=='"'
                ||(gline[0]=='/'&&gline[1]=='/')
                ||!strcmp(gline,"")||gline[0]=='\r'||gline[0]=='\n')
            {
                continue;
            }

            char *p=strstr(gline,"=");
            if (NULL != p)
            {
                strncpy(pname,gline,p-gline);
                char *pvStart=p+1;
                p=strstr(pvStart,"\r");
                if (NULL==p)
                {
                    p=strstr(pvStart,"\n");
                }
                if (NULL !=p)
                {
                    strncpy(pvalue,pvStart,p-pvStart);
                }
                
                if(pname[0]!='\0'&&pvalue[0]!='\0')
                {
                    localHandler->m_handler(pname,pvalue);
                    
                    SET_ARRAY_CLEAN(pname);
                    SET_ARRAY_CLEAN(pvalue);
                }
                else
                {
                    printf("文件格式不对:参数文件中第%d行的参数项[%s]没有指明具体的参数值(参数=参数值).\r\n",lineTotal,gline);
                    return -1;
                }
            }
        }
    }

    if (NULL!=fp)
    {
        fclose(fp);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值