iniparser解析文件说明。

在工作中需要解析一些配置文件,而我解析的是  .ini  文件。基本格式为

[字段名]

Value=12 

下面是我自己写的一个解析文件源码

#include <stdio.h>
#include <string.h>

#define FILE_PATH                   "Volume.ini"
#define GET_FIELD_STATE_ON           1
#define GET_FIELD_STATE_OFF          0

#define GET_WORD_STATE_ON            1
#define GET_WORD_STATE_OFF           0

#define GET_VALUE_STATE_ON           1
#define GET_VALUE_STATE_OFF          0

#define GET_SYMBOL_STATE_ON          1
#define GET_SYMBOL_STATE_OFF         0

int iniGetValue(const char* fieldName , const char* wordName)
{
    FILE *fp;
    char c;    //获取的字符
    char strName[20] = {0};
    int fieldFlag = 0;
    int wordFlag = 0;
    int valueFlag = 0;
    int symbolFlag = 0;
    int num = 0;
    int i = 0;

    fp = fopen (FILE_PATH,"r");
    if (fp == NULL)
    {
        return -1;
    }
    
    while( 1 )
    {
        c = fgetc(fp);
        if(feof(fp))
        {
            break;
        }
        
        //获取数值
        if (valueFlag == GET_VALUE_STATE_ON && c == '-')
        {
            symbolFlag = GET_SYMBOL_STATE_ON;
        }        
        
        if (c == '\n' && valueFlag== GET_VALUE_STATE_ON && symbolFlag == GET_SYMBOL_STATE_ON)
        {
            num = 0 - num;
            symbolFlag = GET_SYMBOL_STATE_OFF;
        }
        
        if (c == '\n' && valueFlag == GET_VALUE_STATE_ON)
        {
            break;
        }
        
        if(c >= '0' && c <= '9' && valueFlag == GET_VALUE_STATE_ON )
        {
            num = num * 10 + c - '0';
        }

        //配对字
        if (c == '=' && wordFlag == GET_WORD_STATE_ON)
        {
            if (strcmp (strName, wordName)==0)
            {
            wordFlag = GET_WORD_STATE_OFF;
            valueFlag = GET_VALUE_STATE_ON;
            }
            //memset(strName ,0 ,sizeof(strName));
            //i = 0;
        }         
        
        if (wordFlag == GET_WORD_STATE_ON && (c != ' ' || c != '\n'))
        {
            strName[i] = c;
            i++;
        }
        
        if(c == '\n')
        {
            memset(strName ,0 ,sizeof(strName));
            i = 0;
        }

        //配对字段     getFieldName(c, strName);
        if(c == ']' && fieldFlag == GET_FIELD_STATE_ON  )
        {
            if (strcmp (strName, fieldName)==0)
            {
            wordFlag = GET_WORD_STATE_ON;
            }    
            fieldFlag = GET_FIELD_STATE_OFF;
        //    memset(strName ,0 ,sizeof(strName));
        //    i = 0;            
        }

        if(fieldFlag == GET_FIELD_STATE_ON  )
        {
            strName[i] = c;
            i ++;
        }
         
        if (c == '[' && fieldFlag == GET_FIELD_STATE_OFF)
        {        
            fieldFlag = GET_FIELD_STATE_ON;
            continue;
        }

    }
    
    fclose(fp);
    return num;
}

int main()
{
    int num = 0;
    num = iniGetValue("DTV", "Volume10");
    printf("%d\n", num);
    return 0;
}

比较繁琐局限也很大 但总的来说实现了十进制整型的解析条件。

后使用网上提供的一些免费的解析库文件  iniparser.c完成任务。

 

posted on 2019-02-22 14:20  MyRain  阅读(275)  评论(0编辑  收藏  举报

导航