博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C读取INI配置文件
阅读量:5169 次
发布时间:2019-06-13

本文共 2790 字,大约阅读时间需要 9 分钟。

http://blog.csdn.net/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

#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;
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比较好。

转载于:https://www.cnblogs.com/wangjian8888/p/8603552.html

你可能感兴趣的文章
php array merge函数,PHP合并数组函数array_merge用法分析
查看>>
php程序整合uc,UCenter应用程序开发简单实例(双向同步),php与UCenter对接
查看>>
php 文件上传mime 类型,php 上传的MIME类型
查看>>
matlab版本 dd_tools,dd_tools安装要求以及svdd
查看>>
matlab有限元分析教程,Matlab 有限元分析与应用
查看>>
cl.fe3.xyz index.php,2_FE_Diabetes.ipynb
查看>>
模糊查询php sql语句怎么写,模糊查询sql语句的方法 有哪些注意事项_中职中专网...
查看>>
php5.3 iis安装,php5.3的安装方法,IIS下PHP5.3的安装过程
查看>>
matlab 画级联结构,基于MATLAB的一种高精度级联Sigma-Delta调制器的结构设计
查看>>
java 圆圈待响应,java-有什么办法可以使圆圈从可移动对象的顶部反弹?
查看>>
java 过滤css,Java兑现将字符串中的html代码过滤掉的方法
查看>>
华中中科技大学php,这是什么情况,在php里面
查看>>
matlab xml write,opencv 创建和读取xml文件以及matlab生成xml
查看>>
tampermonkey脚本php,Tampermonkey挂机脚本常用代码片段
查看>>
python 推导,python各种推导式(超级详细)
查看>>
php iphoto,iPhoto
查看>>
<?php if (have_posts()) : ?>,WordPress主循環(The Loop)函數have_posts(),the_post()詳解
查看>>
oracle数据投毒,Oracle Database Server TNS Listener远程数据投毒漏洞(CVE-2012-1675)的完美解决方法...
查看>>
oracle创建函数难点,oracle创建函数遇到的坑,
查看>>
PHP抽象函数的依赖注入,依赖注入_PHP编程_互联网开发技术网_传播最新的编程技术_php361.com...
查看>>