Bu sorunun çok eski olduğunu biliyorum ama üzerine geldim çünkü linux için çapraz platform, win32 için bir şeye ihtiyacım vardı ... Aşağıdaki işlevi yazdım, INI dosyalarını ayrıştırabilen tek bir işlev, umarım diğerleri onu yararlı bulacaktır.
kurallar ve uyarılar: ayrıştırılacak tampon, NULL ile sonlandırılmış bir dize olmalıdır. İni dosyanızı bir char dizisi dizesine yükleyin ve ayrıştırmak için bu işlevi çağırın. Bölüm adlarının etrafında [] köşeli parantez olmalıdır, örneğin bu [MySection], ayrıca değerler ve bölümler, başında boşluklar olmadan bir satırda başlamalıdır. Dosyaları Windows \ r \ n veya Linux \ n satır sonlarıyla ayrıştırır. Yorumlar # veya // kullanmalı ve dosyanın en üstünde başlamalı, INI girdi verileriyle hiçbir yorum karıştırılmamalıdır. Alıntılar ve işaretler, dönüş dizesinin her iki ucundan da kırpılır. Boşluklar yalnızca teklifin dışındaysa kırpılır. Dizelerin tırnak işareti olması gerekmez ve tırnak işaretleri eksikse beyaz boşluklar kırpılır. Numaraları veya diğer verileri de ayıklayabilirsiniz, örneğin bir kayan nokta varsa, yalnızca ret tamponunda bir atof (ret) gerçekleştirin.
BOOL GrabIniValue(char* buf, const char* section, const char* valname, char* ret, int retbuflen, char** NextSection)
{
if(!buf){*ret=0; return FALSE;}
char* s = buf;
char* e = 0;
if(section)
{
int L = strlen(section);
SearchAgain1:
s = strstr(s,section); if(!s){*ret=0; return FALSE;}
if(s > buf && (*(s-1))!='\n'){s+=L; goto SearchAgain1;}
s+=L;
while(*s!='\n'){s++;} s++;
e = strstr(s,"\n[");
if(e){*e=0;}
if(NextSection)
{ if(e){*NextSection=(e+1);}else{*NextSection=0;} }
}
#define RESTORE_E if(e){*e='\n';}
#define SAFE_RETURN RESTORE_E; (*ret)=0; return FALSE
int L = strlen(valname);
SearchAgain2:
s = strstr(s,valname); if(!s){SAFE_RETURN;}
if(s > buf && (*(s-1))!='\n'){s+=L; goto SearchAgain2;}
s+=L;
while(*s==' ' || *s == '\t'){s++;}
if(!(*s)){SAFE_RETURN;}
if(*s != '='){goto SearchAgain2;}
s++;
while(*s==' ' || *s=='\t'){s++;}
while(*s=='\"' || *s=='\''){s++;}
if(!(*s)){SAFE_RETURN;}
char* E = s;
while(*E!='\r' && *E!='\n' && *E!=0){E++;} E--;
while(E > s && (*E==' ' || *E=='\t')){E--;}
while(E > s && (*E=='\"' || *E=='\'')){E--;}
L = E-s+1;
if(L<1 || L+1 > retbuflen){SAFE_RETURN;}
strncpy(ret,s,L);
ret[L]=0;
RESTORE_E;
return TRUE;
#undef RESTORE_E
#undef SAFE_RETURN
}
Nasıl kullanılır ... örnek ....
char sFileData[] = "[MySection]\r\n"
"MyValue1 = 123\r\n"
"MyValue2 = 456\r\n"
"MyValue3 = 789\r\n"
"\r\n"
"[MySection]\r\n"
"MyValue1 = Hello1\r\n"
"MyValue2 = Hello2\r\n"
"MyValue3 = Hello3\r\n"
"\r\n";
char str[256];
char* sSec = sFileData;
char secName[] = "[MySection]";
while(sSec)
{
char* next=0;
if(GrabIniValue(sSec,secName,"MyValue1",str,sizeof(str),&next)) { printf("MyValue1 = [%s]\n",str); }
if(GrabIniValue(sSec,secName,"MyValue2",str,sizeof(str),0)) { printf("MyValue2 = [%s]\n",str); }
if(GrabIniValue(sSec,secName,"MyValue3",str,sizeof(str),0)) { printf("MyValue3 = [%s]\n",str); }
printf("\n");
sSec = next;
}