IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C语言读取INI配置文件 (Linux可用)

    admin发表于 2016-01-12 10:01:07
    love 0

    Linux平台下C语言读取配置文件,Linux如何读取配置文件。c语言实现,可在linux平台上用了,在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux平台上就一筹莫展了。为了解决该问题,打算用C来读取.ini,即可不受平台的限制了。

    示例代码:

    #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);
    	char *a = GetIniKeyString("CAT","name",g_szConfigPath);
    	printf("%d\r\n",iCatAge);
    	printf("%s\r\n",a);
    
    	return 0;
    }

    搬运工:C/C++程序员之家 分享一些源代码 原文链接:http://blog.csdn.net/lxh1230119/article/details/7781333/



沪ICP备19023445号-2号
友情链接