Wiem, że to pytanie jest bardzo stare, ale natknąłem się na to, ponieważ potrzebowałem czegoś międzyplatformowego dla linuxa, win32 ... Napisałem funkcję poniżej, jest to pojedyncza funkcja, która może analizować pliki INI, mam nadzieję, że inni uznają ją za przydatną.
reguły i zastrzeżenia: buf do przeanalizowania musi być łańcuchem zakończonym znakiem NULL. Załaduj swój plik ini do tablicy znaków i wywołaj tę funkcję, aby go przeanalizować. nazwy sekcji muszą być otoczone nawiasami kwadratowymi [], na przykład [MySection], a także wartości i sekcje muszą zaczynać się w wierszu bez początkowych spacji. Sparsuje pliki z końcówkami linii Windows \ r \ n lub Linux \ n. Komentarze powinny zawierać # lub // i zaczynać się na górze pliku, żadne komentarze nie powinny być mieszane z danymi wejściowymi INI. Cytaty i znaczniki są obcinane z obu końców zwracanego ciągu. Spacje są przycinane tylko wtedy, gdy znajdują się poza ofertą. Łańcuchy nie muszą mieć cudzysłowów, a białe znaki są obcinane, jeśli brakuje cudzysłowów. Możesz także wyodrębnić liczby lub inne dane, na przykład jeśli masz zmiennoprzecinkową, po prostu wykonaj atof (ret) w buforze ret.
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
}
Jak używać ... przykład ....
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;
}