在工作中需要解析一些配置文件,而我解析的是 .ini 文件。基本格式为
[字段名]
Value=12
下面是我自己写的一个解析文件源码
#include#include #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 0int 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完成任务。