用C读取INI配置文件
⽤C读取INI配置⽂件blog.csdn/chexlong/article/details/6818017
#define CONF_FILE_PATH "Config.ini"
#include <string.h>
#ifdef WIN32
#include <Windows.h>
#include <stdio.h>
#else
#define MAX_PATH 260
360杀毒怎么卸载#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#endif
char g_szConfigPath[MAX_PATH];
//获取当前程序⽬录
int GetCurrentPath(char buf[],char *pFileName)
{
#ifdef WIN32
GetModuleFileName(NULL,buf,MAX_PATH);
#else
char pidfile[64];
int bytes;
int fd;
sprintf(pidfile, "/proc/%d/cmdline", getpid());
fd = open(pidfile, O_RDONLY, 0);
bytes = read(fd, buf, 256);
close(fd);
buf[MAX_PATH] = '\0';
#endif
char * p = &buf[strlen(buf)];
do
{
*p = '\0';
p--;
#ifdef WIN32
} while( '\\' != *p );
#else
} while( '/' != *p );
#endif
p++;
//配置⽂件⽬录
memcpy(p,pFileName,strlen(pFileName));
return 0;
}
//从INI⽂件读取字符串类型数据
char *GetIniKeyString(char *title,char *key,char *filename)
{
FILE *fp;
char szLine[1024];
static char tmpstr[1024];
int rtnval;
int i = 0;歌曲大全100首流行歌曲免费听
int flag = 0;
char *tmp;
if((fp = fopen(filename, "r")) == NULL)
{
printf("have no such file \n");
return "";
}
while(!feof(fp))
{
rtnval = fgetc(fp);
if(rtnval == EOF)
{
break;
}
else
{
szLine[i++] = rtnval;
}
连锁酒店加盟条件if(rtnval == '\n')
{
#ifndef WIN32轻伤二级怎么判刑和赔偿
i--;
#endif
szLine[--i] = '\0';
酸菜鱼怎么做好吃
i = 0;
tmp = strchr(szLine, '=');
if(( tmp != NULL )&&(flag == 1))
{
if(strstr(szLine,key)!=NULL)
{
//注释⾏
if ('#' == szLine[0])
{
}
else if ( '\/' == szLine[0] && '\/' == szLine[1] )
{
}
else
{
//打key对应变量
strcpy(tmpstr,tmp+1);
fclose(fp);
return tmpstr;
}
}
}
else
{
strcpy(tmpstr,"[");
strcat(tmpstr,title);
strcat(tmpstr,"]");
if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )
{
//到title
flag = 1;
}
}
}
}
fclose(fp);
return "";
}
//从INI⽂件读取整类型数据
int GetIniKeyInt(char *title,char *key,char *filename) {
return atoi(GetIniKeyString(title,key,filename));
}
int main(int argc, char* argv[])
{
char buf[MAX_PATH];
memset(buf,0,sizeof(buf));
GetCurrentPath(buf,CONF_FILE_PATH);
strcpy(g_szConfigPath,buf);
int iCatAge;
char szCatName[32];
iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);
strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));
return 0;
}
感觉作者的程序还有⼏处bug
第86⾏
#ifndef WIN32
i--;
#endif
这个地⽅如果是吧linux下的配置⽂件拿到windows上⽤呢,⼜假如我⽤editplus或者ultraedit等⼯具修改了⽂件换⾏⽅式呢?应改为
if(szLine[i-1] == '\r') {
i--;
}
第95⾏,
if(strstr(szLine,key)!=NULL)
判断szLine中不含有key字符串后,应该将szLine清零,以备下次循环的时候使⽤,所以这个地⽅应该加⼀个else语句
else
{
memset(szLine,0,1024);
}
哪款山地车性价比高第76⾏,
if(rtnval == EOF)
这个地⽅如果判断⽂件结尾了就退出,但是如果配置⽂件的最后⼀⾏的末尾是EOF的话,这个地⽅就出错了
即最后⼀⾏是这种情况
xxxxxxEOF
如果最后⼀⾏是如下情况的话,是能通过的,作者肯定是只考虑了这种情况
xxxxxx
EOF
所以这个地⽅应该改为
if(rtnval == EOF && sizeof(szLine) != 0)
还有就是顺便提⼀下作者的main函数中第148⾏,
strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));
我也不是很推荐这么写,你程序内部的是按照每⾏1024个处理的,所以这个地⽅还是写成strncpy⽐较好。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。