C语言读取配置文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语⾔读取配置⽂件⾃从⼤学学完C之后,就再也没⽤过它了,
在⽹上找代码,七拼⼋凑之后,终于成形~~勉强能⽤,不喜勿喷,^_^!
int GetValue(const wchar_t *key, wchar_t *value)
{
FILE* fpcfg = NULL;
wchar_t var[256], val[256];//key,value
wchar_t linebuf[1024];
wchar_t* ptr1 = NULL;
wchar_t* ptr2 = NULL;
wchar_t* delimiter = NULL;
int k = 0;
assert(key != NULL && value != NULL);
//testConfig.ini中的内容为:
//key1 = value1
//key2 = value2
fpcfg = fopen("testConfig.ini", "rt");
if(fpcfg == NULL)
{
return -1;
}
while(fgetws(linebuf, sizeof(linebuf), fpcfg) != NULL)
{
//ignore annotation line
if(linebuf[0]=='#' || linebuf[0]==';')
{
continue;
}
//ignore empty line
ptr1 = linebuf;
while(*ptr1==0x20 || *ptr1=='\t')
ptr1++;
if(!*ptr1 || *ptr1=='\n')
{
continue;
}
//search "="
ptr2 = ptr1;
while(*ptr2 && *ptr2!='=')
{
ptr2++;
}
delimiter = *ptr2?ptr2:NULL;
//if current line start with "=", continue next line
if(!delimiter || delimiter==ptr1)
{
continue;
}
//*delimiter = '\0';
ptr2 = delimiter-1;
//ignore blank before "="
while(*ptr2==0x20 || *ptr2=='\t')
{ ptr2--;}
//check key length
k = ptr2-ptr1+1;
if(k>(int)sizeof(var)-1)
{
//The key name is out of length."
continue;
}
//save key name
ptr2 = var;
while(k--)
{
*ptr2++ = *ptr1++;
}
*ptr2 = '\0';
//locate value's start point(may be '\0')
ptr1 = delimiter+1;
//ignore blank after "="
while(*ptr1==0x20 || *ptr1=='\t')
{
ptr1++;
}
//set ptr2 point to line end
ptr2 = linebuf;
while(*ptr2)
{ptr2++;}
ptr2--;
if(*ptr2=='\n')
{
*ptr2-- = '\0';
}
//ignore blank line end
//if value is empty,ptr2 --> = , ptr1>ptr2
while(*ptr2==0x20 || *ptr2=='\t' )
{
ptr2--;
}
//check value length
k = ptr2-ptr1+1;
if(k>(int)sizeof(val)-1)
{
//The value is out of length"
continue;
}
//save value
ptr2 = val;
while(k-->0)
{
*ptr2++ = *ptr1++;
}
*ptr2 = '\0';
if(wcsncmp(var,key, wcslen(var) > wcslen(key) ? wcslen(var) : wcslen(key))==0){ wcsncpy(value,val, wcslen(val));
return0;
}
}
fclose(fpcfg);
fpcfg = NULL;
return -1;
}
恩,再来个main⽅法测试下:
int _tmain(int argc, wchar_t* argv[])
{
wchar_t value[256] = {0};
wchar_t keyParam[256] = L"ip";
wchar_t *temp = (wchar_t *)malloc(sizeof(wchar_t) * 256);
if(temp != NULL){
memset(temp, 0x00, sizeof(wchar_t) * 256);
}else{
return -1;
}
if(0 == GetValue(keyParam, temp)){
wcsncpy(value, temp, wcslen(temp));
wprintf(L"Found: %s\n", value);
}else{
wprintf(L"Not Found!!\n");
}
if(temp != NULL)
{
free(temp);
temp = NULL;
}
return0;
}
View Code
好吧,这确实是个很丑陋的版本,仅供⾃⼰留着备⽤。

点这⾥。

相关文档
最新文档