আমি জানি এই প্রশ্নটি অনেক পুরানো, তবে আমি এটি নিয়ে এসেছি কারণ আমার লিনাক্স, উইন 32 এর জন্য কিছু ক্রস প্ল্যাটফর্মের প্রয়োজন ছিল ... আমি নীচে ফাংশনটি লিখেছি, এটি একটি একক ফাংশন যা INI ফাইলগুলিকে পার্স করতে পারে, আশা করি অন্যরা এটির কাজে লাগবে।
নিয়ম ও সতর্কতা: পারফ করতে বুফ অবশ্যই একটি নূতন সমাপ্ত স্ট্রিং হওয়া উচিত। আপনার ini ফাইলটিকে একটি চর অ্যারে স্ট্রিংয়ে লোড করুন এবং পার্স করার জন্য এই ফাংশনটিকে কল করুন। বিভাগের নামগুলি অবশ্যই তাদের চারপাশে [] বন্ধনী থাকা উচিত, যেমন এই [মাইসেকশন] এর মতো মান এবং বিভাগগুলি শীর্ষস্থানীয় ফাঁকা স্থান ছাড়াই একটি লাইনে শুরু হওয়া উচিত। এটি উইন্ডোজ files r \ n বা লিনাক্স line 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;
}