मुझे पता है कि यह प्रश्न बहुत पुराना है, लेकिन मैं इस पर आया क्योंकि मुझे linux, win32 के लिए कुछ क्रॉस प्लेटफॉर्म की आवश्यकता थी ... मैंने नीचे फ़ंक्शन लिखा था, यह एक एकल फ़ंक्शन है जो INI फ़ाइलों को पार्स कर सकता है, उम्मीद है कि अन्य इसे उपयोगी पाएंगे।
नियम और चेतावनी: बफ़ से पार्स करने के लिए एक पूर्ण समाप्त स्ट्रिंग होना चाहिए। अपनी आईएनआई फ़ाइल को चार सरणी स्ट्रिंग में लोड करें और इसे पार्स करने के लिए इस फ़ंक्शन को कॉल करें। सेक्शन के नाम उनके चारों ओर [] कोष्ठक होने चाहिए, जैसे कि यह [MySection], मान और अनुभाग भी लीडिंग स्पेस के बिना एक लाइन पर शुरू होने चाहिए। यह विंडोज़ \ r \ n या लिनक्स \ n लाइन एंडिंग के साथ फाइलों को पार्स करेगा। टिप्पणियों को # या // का उपयोग करना चाहिए और फ़ाइल के शीर्ष पर शुरू करना चाहिए, आईएनआई प्रविष्टि डेटा के साथ कोई टिप्पणी नहीं मिलनी चाहिए। रिटर्न स्ट्रिंग के दोनों सिरों से उद्धरण और टिक को ट्रिम किया जाता है। यदि वे उद्धरण से बाहर हैं, तो रिक्त स्थान केवल छंटनी की जाती है। उद्धरण के लिए स्ट्रिंग्स की आवश्यकता नहीं होती है, और उद्धरण गायब होने पर व्हाट्सएप को ट्रिम किया जाता है। आप संख्या या अन्य डेटा भी निकाल सकते हैं, उदाहरण के लिए यदि आपके पास एक फ्लोट है बस रिट बफर पर एक एटॉफ़ (रिट) करें।
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;
}