So che questa domanda è molto vecchia, ma mi sono imbattuto perché avevo bisogno di qualcosa di multipiattaforma per Linux, win32 ... Ho scritto la funzione di seguito, è una singola funzione che può analizzare i file INI, spero che altri la troveranno utile.
regole e avvertenze: buf da analizzare deve essere una stringa terminata con NULL. Carica il tuo file ini in una stringa di array di caratteri e chiama questa funzione per analizzarlo. i nomi delle sezioni devono contenere [] parentesi quadre, come questa [MySection], inoltre i valori e le sezioni devono iniziare su una riga senza spazi iniziali. Analizzerà i file con Windows \ r \ no con terminazioni di riga Linux \ n. I commenti devono utilizzare # o // e iniziare all'inizio del file, nessun commento deve essere mischiato con i dati di immissione INI. Virgolette e segni di graduazione vengono tagliati da entrambe le estremità della stringa di ritorno. Gli spazi vengono tagliati solo se sono al di fuori della citazione. Le stringhe non devono contenere virgolette e gli spazi bianchi vengono tagliati se mancano virgolette. Puoi anche estrarre numeri o altri dati, ad esempio se hai un float basta eseguire un atof (ret) sul buffer 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
}
Come usare ... esempio ....
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;
}