Chinaunix首页 | 论坛 | 博客
  • 博客访问: 724059
  • 博文数量: 98
  • 博客积分: 3257
  • 博客等级: 中校
  • 技术积分: 966
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-15 17:19
文章存档

2020年(1)

2018年(1)

2017年(1)

2016年(2)

2015年(2)

2013年(3)

2012年(24)

2011年(28)

2010年(4)

2009年(9)

2008年(23)

我的朋友

分类: C/C++

2008-09-06 11:15:20

如题:
比如
test.cfg

[test]
DEBUG=1
Content="test"

有可以直接读取倒KeyEBUG的值1的接口吗?

在Linux中有直接读写配置文件的各个键值的接口嘛?

CODE:
/
*********************************************
        FileName:        FileScan.c
        Describe:        Functions For Read Config File
        Author:                Eboy
        Date:                2003.8.28
****************************************************/
#ifdef _WINDOWS_
#include ;
#include ;
#endif
#include ;
#include ;
#include ;

#define CONF_FILE_MAX_LINE        50
#define CONF_FILE_MAX_ROW        100
/*
*        函数名:IsBreakChar()
*        功能:        判断是否为行结束符
*        返回值:1表示真,0表示假
*        参数说明:char ch 需要判断的字符
*
*/
int IsBreakChar(char ch)
{
        if(ch==9)        //Tab Key
                return 0;
        if((ch<32)&&(ch>;0))
                return 1;
        else
                return 0;
}
/*
*        函数名:ReadLine()
*        功能:        从文件中读出一行
*        参数说明:FILE* fpt 文件描述符
*                 char* linestr 输出数据,结尾为'\0'的字符串
*/
int ReadLine(FILE* fpt, char *linestr)
{
        int i,rv;
        char cc;
        char buf[CONF_FILE_MAX_ROW];

        if(feof(fpt)){
                return 1;
        }
        for(i=0;i                 rv=fread(&cc,1,1,fpt);
                if(rv<1)
                        break;
                if(IsBreakChar(cc)==1)
                        break;
                buf[i]=cc;
        }
        buf[i]='\0';
        strcpy(linestr,buf);
        return 0;       
}
/*
*        函数名:TrimSpace()
*        功能:        将字符串中的空格删除
*        参数说明:char_PTR ori 输入字符串
*                 char * trim 输出字符串
*/
int TrimSpace(char * ori,char * trim)
{
        int i,j,qq,len;
        char tmp[CONF_FILE_MAX_ROW];

        j=qq=0;
        len=strlen(ori);
        for(i=0;i                 if(qq==1)
                        tmp[j]=ori[i];
                else{
                        if(ori[i]<33)
                                continue;
                        else{
                                tmp[j]=ori[i];
                                qq=1;
                        }
                }
                j++;
        }
        tmp[j]='\0';

        j=qq=0;
        for(i=strlen(tmp)-1;i>;=0;i--){
                if(qq==1)
                        trim[j]=tmp[i];
                else{
                        if(tmp[i]<33)
                                continue;
                        else{
                                trim[j]=tmp[i];
                                qq=1;
                        }
                }
                j++;
        }
        trim[j]='\0';
        j=strlen(trim);
        for(i=0;i                 tmp[i]=trim[j-i-1];
        }
        memcpy(trim,tmp,j);
        return 0;
}

/*
*        函数名:ReadSector()
*        功能:        从输入字符串中分解出指定项的值
*        返回值: 如果成功返回0
*        参数说明:char * line 输入字符串
*                 char * SectName 指定域的名称
*                  char * SectVa   输出指定域的值(返回成功时有效)
*/
int ReadSector(char * line,char * SectName,char * SectVal)
{
        int i;
        int tlen,equpos=0;
        char lineBuf[CONF_FILE_MAX_ROW];
        char oriSectName[CONF_FILE_MAX_ROW],tmpSectName[CONF_FILE_MAX_ROW];
        char oriSectVal[CONF_FILE_MAX_ROW];
       
        TrimSpace(line,lineBuf);
        tlen=strlen(lineBuf);
        for(i=0;i                 if((lineBuf[i]=='#')||(lineBuf[i]==';'))
                        break;
        }
        if(i==0)
                return 1;
        lineBuf[i]='\0';
        tlen=strlen(lineBuf);
        for(i=0;i                 if(lineBuf[i]=='='){
                        equpos=i;
                        break;
                }
        }
        if(equpos==0)
                return 1;
        memcpy(oriSectName,lineBuf,equpos);
        oriSectName[equpos]='\0';
        TrimSpace(oriSectName,tmpSectName);
        if((SectName[0]=='#')||(SectName[0]==';')){
                return 1;
        }
        if(strcmp(tmpSectName,SectName))
                return 1;
        memcpy(oriSectVal,lineBuf+equpos+1,tlen-equpos-1);
        oriSectVal[tlen-equpos-1]='\0';
        TrimSpace(oriSectVal,SectVal);
        return 0;
}
/*
*        函数名:AnalizeConfFile()
*        功能:        从指定文件中分解出指定域的值
*        返回值: 如果成功返回0
*        参数说明:char * Filename 指定配置文件名
*                 char * SectName 指定域的名称
*                  char * SectVa   输出指定域的值(返回成功时有效)
*/
int AnalizeConfFile(char * Filename,char * sector,char * sectval)
{
        int i,rv,flag=0;
        FILE *fp;
        char line[CONF_FILE_MAX_LINE];
        char syspath[256];

#ifdef _WINDOWS_
        if(Filename!=NULL)
                strcpy(syspath,Filename);
        if(Filename == NULL)
        {
                if ((rv = GetSystemDirectory(syspath,256))<=0)
                {
                ErrorLocation;
                return 1;
                }
                if (rv >; 3)
                strcat(syspath,"/MyFile.ini");
                else
                strcat(syspath,"MyFile.ini");
                //#endif
        }
#else
        if(Filename != NULL)
        {
                strcpy(syspath,Filename);
        }
        if(Filename ==NULL)
        {
                strcpy(syspath,"/etc/MyFile.ini");
        }
#endif
        fp=fopen(syspath,"r");
        if(fp==NULL)
        {
                return 1;
        }
        for(i=0;i         {
                rv = ReadLine(fp,line);
                if(rv != 0)
                        break;
                if(ReadSector(line,sector,sectval)==0)
                {
                        flag = 1;
                        break;
                }
        }
        if (flag == 0)
                return -1;
        fclose(fp);
        return 0;
}

使用时直接调用AnalizeConfFile函数即可。

另一选择:用xml+expat吧,很方便的,而且expat还可以很容易的在vc上编译。

阅读(2782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~