Я знаю, що це запитання дуже давнє, але я натрапив на нього, тому що мені потрібна була якась крос-платформа для Linux, win32 ... Я написав функцію нижче, це одна функція, яка може аналізувати файли INI, сподіваюся, іншим це буде корисно.
правила та застереження: buf для синтаксичного аналізу повинен мати рядок із закінченням NULL. Завантажте свій файл ini у рядок масиву символів і викликайте цю функцію, щоб проаналізувати його. Назви розділів повинні мати [] дужки навколо них, наприклад, цей [MySection], також значення та розділи повинні починатися на рядку без пробілів. Він проаналізує файли з Windows \ r \ n або з закінченнями рядків Linux \ n. Коментарі повинні використовувати # або // і починатись у верхній частині файлу, жодні коментарі не повинні змішуватися з даними входу INI. Цитати та галочки обрізаються з обох кінців зворотного рядка. Пробіли обрізаються лише в тому випадку, якщо вони виходять за межі цитати. Рядки не повинні мати лапок, а пробіли обрізаються, якщо лапки відсутні. Ви також можете витягти числа або інші дані, наприклад, якщо у вас є плаваюча операція, просто виконайте atof (ret) на буфері 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
}
Як використовувати ... приклад ....
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;
}