<强> C读取ini文件强>
<强>前言:强>
在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取. ini配置文件内容,但是在Linux平台上就一筹莫展了。为了解决该问题,打算用C来读取。ini,即可不受平台的限制了。
#定义CONF_FILE_PATH“Config.ini” # include & lt; string.h> # ifdef WIN32 # include & lt; Windows.h> # include & lt; stdio.h> 其他# #定义MAX_PATH 260 # include & lt; unistd.h> # include & lt; fcntl.h> # include & lt; stdio.h> # include & lt; stdlib.h> # include & lt; stdarg.h> # endif char g_szConfigPath [MAX_PATH];//获取当前程序目录 int GetCurrentPath (char buf [], char * pFileName) { # ifdef WIN32 GetModuleFileName (NULL, buf MAX_PATH); 其他# char pidfile [64]; int字节; int fd; sprintf (pidfile“/proc/% d/cmdline getpid ()); fd=开放(pidfile O_RDONLY 0); 缓冲区字节=阅读(fd, 256); 关闭(fd); 但[MAX_PATH]=' \ 0 '; # endif char * p=, buf [strlen (buf)]; 做 { * p=' \ 0 '; p——; # ifdef WIN32 },(“\ \”!=* p); 其他# },(‘/?=* p); # endif p + +;//配置文件目录 memcpy (p pFileName strlen (pFileName)); 返回0; }//从INI文件读取字符串类型数据 char * GetIniKeyString (char *标题,char *键,char *文件名) { 文件*《外交政策》; char szLine [1024]; 静态字符tmpstr [1024]; int rtnval; int i=0; int国旗=0; char * tmp; 如果((fp=fopen(文件名,“r”))==NULL) { printf(“没有这样的文件\ n”); 返回"; } 而(! feof (fp)) { rtnval=获取(fp); 如果(rtnval==EOF) { 打破; } 其他的 { szLine我+ +=rtnval; } 如果(rtnval==' \ n ') { 的ifndef WIN32 我,; # endif szLine[我]=' \ 0 '; 我=0; tmp=strchr (szLine, '='); 如果((tmp !=NULL),和(标志==1)) { 如果(strstr (szLine、关键)!=NULL) {//注释行 如果(' # '==szLine [0]) { } else if (‘\/==szLine [0],,“\ \”==szLine [1]) { } 其他的 {//找打关键对应变量 拷贝字符串(tmpstr, tmp + 1); 文件关闭(fp); 返回tmpstr; } } } 其他的 { strcpy (tmpstr,“[”); strcat (tmpstr、标题); strcat (tmpstr“]”); 如果(strncmp (tmpstr、szLine strlen (tmpstr))==0) {//找到冠军 标志=1; } } } } 文件关闭(fp); 返回"; }//从INI文件读取整类型数据 int GetIniKeyInt (char *标题,char *键,char *文件名) { 返回atoi (GetIniKeyString(标题、关键文件名)); } int主要(int命令行参数个数,char * argv []) { 字符缓冲区(MAX_PATH); memset (buf 0 sizeof (buf)); GetCurrentPath (buf CONF_FILE_PATH); strcpy (g_szConfigPath buf); int iCatAge; char szCatName [32]; iCatAge=GetIniKeyInt(“猫”,“年龄”,g_szConfigPath); strcpy (szCatName GetIniKeyString(“猫”,“名字”,g_szConfigPath)); 返回0; } >之前#定义CONF_FILE_PATH“Config.ini” # include & lt; string.h> # ifdef WIN32 # include & lt; Windows.h> # include & lt; stdio.h> 其他# #定义MAX_PATH 260 # include & lt; unistd.h> # include & lt; fcntl.h> # include & lt; stdio.h> # include & lt; stdlib.h> # include & lt; stdarg.h> # endif char g_szConfigPath [MAX_PATH];//获取当前程序目录 int GetCurrentPath (char buf [], char * pFileName) { # ifdef WIN32 GetModuleFileName (NULL, buf MAX_PATH); 其他# char pidfile [64]; int字节; int fd; sprintf (pidfile“/proc/% d/cmdline getpid ()); fd=开放(pidfile O_RDONLY 0); 缓冲区字节=阅读(fd, 256); 关闭(fd); 但[MAX_PATH]=' \ 0 '; # endif char * p=, buf [strlen (buf)]; 做 { * p=' \ 0 '; p——; # ifdef WIN32 },(“\ \”!=* p); 其他# },(‘/?=* p); # endif p + +;//配置文件目录 memcpy (p pFileName strlen (pFileName)); 返回0; }//从INI文件读取字符串类型数据 char * GetIniKeyString (char *标题,char *键,char *文件名) { 文件*《外交政策》; char szLine [1024]; 静态字符tmpstr [1024]; int rtnval; int i=0; int国旗=0; char * tmp; 如果((fp=fopen(文件名,“r”))==NULL) { printf(“没有这样的文件\ n”); 返回"; } 而(! feof (fp)) { rtnval=获取(fp); 如果(rtnval==EOF) { 打破; } 其他的 { szLine我+ +=rtnval; } 如果(rtnval==' \ n ') { 的ifndef WIN32 我,; # endif szLine[我]=' \ 0 '; 我=0; tmp=strchr (szLine, '='); 如果((tmp !=NULL),和(标志==1)) { 如果(strstr (szLine、关键)!=NULL) {//注释行 如果(' # '==szLine [0]) { } else if (‘\/==szLine [0],,“\ \”==szLine [1]) { } 其他的 {//找打关键对应变量 拷贝字符串(tmpstr, tmp + 1); 文件关闭(fp); 返回tmpstr; } } } 其他的 { strcpy (tmpstr,“[”); strcat (tmpstr、标题); strcat (tmpstr“]”); 如果(strncmp (tmpstr、szLine strlen (tmpstr))==0) {//找到冠军 标志=1; } } } } 文件关闭(fp); 返回"; }//从INI文件读取整类型数据 int GetIniKeyInt (char *标题,char *键,char *文件名) { 返回atoi (GetIniKeyString(标题、关键文件名)); } int主要(int命令行参数个数,char * argv []) { 字符缓冲区(MAX_PATH); memset (buf 0 sizeof (buf)); GetCurrentPath (buf CONF_FILE_PATH); strcpy (g_szConfigPath buf); int iCatAge; char szCatName [32]; iCatAge=GetIniKeyInt(“猫”,“年龄”,g_szConfigPath); strcpy (szCatName GetIniKeyString(“猫”,“名字”,g_szConfigPath)); 返回0; }C读取ini文件的实例详解