因此,我需要访问.ini文件,如:
[alpha]
colour=green
size=78
style=italic
[beta]
colour=black
size=94
mode=xyz
[gamma]
black=0231
blue=127
red=0x35876f
我需要找到一个[likethis]部分,然后是一个参数(以下三个之一),然后返回它的值。所以,章节alpha,param大小,我返回" 78"。部分伽玛,参数红色,我返回" 0x35876f"。部分beta,param red不存在。
char *sFile: Name of file
char *sSec: Section where the parameter is
char *sPar: Parametro wanted
char *sRet: Array where I store the value
int ilen: Lenght of the array
我用fp = fopen (sFile,"r");
打开文件,但是找到并返回值变得很复杂,我不知道这是否是最好的方法。
char *strAux, *strAux2;
while(!feof(fp)) //While the file doesnt end
{
fscanf (fp,"%s",strAux); //Read a line of the file
if(!strcmp(strAux,sSec)) //If I found the section
{
for(j=0; j<3; j++)
{
fscanf(fp,"%s",strAux); //Read a line
strAux2 = strtok (strAux,"="); //store the param in strAux2 from the start to the =
if (!strcmp(strAux2,sPar))
{
strAux2 = strtok (NULL,"\r\n"); //store in strAux2 frmo the = to end of line
if(strlen(strAux2)>ilen)
{
fclose(fp);
return (-3); //Error, Lenght Value > ilen
}else{
strncpy(sRet,strAux2,ilen);
fclose(fp);
return (sRet); //Return the value
}
}
}
}
}
fclose(fp);
return (-2); //Error, Parameter not found
这可以吗?
答案 0 :(得分:0)
我认为更简单的手动方法
打开文件
搜索以[
完成时查找具有param名称和a =的行
(如果您发现[
搜索失败了)
&#39; =&#39;
周围的额外跳过空间FILE *f = fopen("test.ini", "r");
char *sSec = "beta";
char *sPar = "size";
char *sRet = NULL;
char *p;
char buf[1024];
bool section_search = true;
while (p = fgets(buf, 1024, f)) {
if (section_search) {
const char *q = sSec;
if (*p != '[') {
continue;
}
p++; /* read [ */
while (*q && *p == *q) {
p++;
q++;
}
if (*q == '\0' && *p == ']') {
section_search = false;
continue;
}
} else {
const char *q = sPar;
if (*p == '[') {
break;
}
while (*q && *p == *q) {
p++;
q++;
}
if (*q != '\0')
continue;
while (*p == ' ') p++;
if (*p != '=')
continue;
p++; /*read =*/
while (*p == ' ') p++;
sRet = p;
break;
}
}
if (sRet) {
printf("value found %s", sRet);
} else {
printf("value not found");
}
答案 1 :(得分:0)
不要使用while(!feof)
。相反,您可以使用while(fscanf(fp,"%s",buf) ==1)
,并且strtok
可以对=
使用相同的令牌分隔符作为strAux
。在fscanf
中使用{{1}}之前,您应该为{{1}}分配内存。