linux读取配置文件(C语言版)

kvconf.h
---------------------------------------------------------
    #define KEYVALLEN 256  
      
    /*   删除左边的空格   */  
    char * l_trim(char * szOutput, const char *szInput);  
      
    /*   删除右边的空格   */  
    char *r_trim(char *szOutput, const char *szInput);  
      
    /*   删除两边的空格   */  
    char * a_trim(char * szOutput, const char * szInput);  
      
      
    int GetProfileString(char *profile, char *AppName, char *KeyName, char *KeyVal );  
----------------------------------------------------------------------
kvconf.c
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <assert.h>  
    #include <ctype.h>  
    #include <errno.h>  
    #include "kvconf.h"  
      
      
    /*   删除左边的空格   */  
    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);  
    }  
      
    /*   删除右边的空格   */  
    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;  
    }  
      
    /*   删除两边的空格   */  
    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);  
    }  
      
    int main()  
    {  
        char ip[16];  
        GetProfileString("./cls.conf", "cls_server", "ip", ip);  
        printf("%s\n",ip);  
        return 0;  
    }  


------------------------------------------------------------------------

配置文件例子如下:
cls.conf

    [cls_server]  
    #配置文件等号左右可以有空格也可以没有  
    ip=192.16.31.2  

猜你喜欢

转载自gengzg.iteye.com/blog/2233719