C 读取ini文件的实例详解
C读取ini文件
前言:
在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux平台上就一筹莫展了。为了解决该问题,打算用C来读取.ini,即可不受平台的限制了。
#defineCONF_FILE_PATH"Config.ini" #include#ifdefWIN32 #include #include #else #defineMAX_PATH260 #include #include #include #include #include #endif charg_szConfigPath[MAX_PATH]; //获取当前程序目录 intGetCurrentPath(charbuf[],char*pFileName) { #ifdefWIN32 GetModuleFileName(NULL,buf,MAX_PATH); #else charpidfile[64]; intbytes; intfd; 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--; #ifdefWIN32 }while('\\'!=*p); #else }while('/'!=*p); #endif p++; //配置文件目录 memcpy(p,pFileName,strlen(pFileName)); return0; } //从INI文件读取字符串类型数据 char*GetIniKeyString(char*title,char*key,char*filename) { FILE*fp; charszLine[1024]; staticchartmpstr[1024]; intrtnval; inti=0; intflag=0; char*tmp; if((fp=fopen(filename,"r"))==NULL) { printf("havenosuchfile\n"); return""; } while(!feof(fp)) { rtnval=fgetc(fp); if(rtnval==EOF) { break; } else { szLine[i++]=rtnval; } if(rtnval=='\n') { #ifndefWIN32 i--; #endif szLine[--i]='\0'; i=0; tmp=strchr(szLine,'='); if((tmp!=NULL)&&(flag==1)) { if(strstr(szLine,key)!=NULL) { //注释行 if('#'==szLine[0]) { } elseif('\/'==szLine[0]&&'\/'==szLine[1]) { } else { //找打key对应变量 strcpy(tmpstr,tmp+1); fclose(fp); returntmpstr; } } } else { strcpy(tmpstr,"["); strcat(tmpstr,title); strcat(tmpstr,"]"); if(strncmp(tmpstr,szLine,strlen(tmpstr))==0) { //找到title flag=1; } } } } fclose(fp); return""; } //从INI文件读取整类型数据 intGetIniKeyInt(char*title,char*key,char*filename) { returnatoi(GetIniKeyString(title,key,filename)); } intmain(intargc,char*argv[]) { charbuf[MAX_PATH]; memset(buf,0,sizeof(buf)); GetCurrentPath(buf,CONF_FILE_PATH); strcpy(g_szConfigPath,buf); intiCatAge; charszCatName[32]; iCatAge=GetIniKeyInt("CAT","age",g_szConfigPath); strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath)); return0; }
#defineCONF_FILE_PATH"Config.ini" #include#ifdefWIN32 #include #include #else #defineMAX_PATH260 #include #include #include #include #include #endif charg_szConfigPath[MAX_PATH]; //获取当前程序目录 intGetCurrentPath(charbuf[],char*pFileName) { #ifdefWIN32 GetModuleFileName(NULL,buf,MAX_PATH); #else charpidfile[64]; intbytes; intfd; 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--; #ifdefWIN32 }while('\\'!=*p); #else }while('/'!=*p); #endif p++; //配置文件目录 memcpy(p,pFileName,strlen(pFileName)); return0; } //从INI文件读取字符串类型数据 char*GetIniKeyString(char*title,char*key,char*filename) { FILE*fp; charszLine[1024]; staticchartmpstr[1024]; intrtnval; inti=0; intflag=0; char*tmp; if((fp=fopen(filename,"r"))==NULL) { printf("havenosuchfile\n"); return""; } while(!feof(fp)) { rtnval=fgetc(fp); if(rtnval==EOF) { break; } else { szLine[i++]=rtnval; } if(rtnval=='\n') { #ifndefWIN32 i--; #endif szLine[--i]='\0'; i=0; tmp=strchr(szLine,'='); if((tmp!=NULL)&&(flag==1)) { if(strstr(szLine,key)!=NULL) { //注释行 if('#'==szLine[0]) { } elseif('\/'==szLine[0]&&'\/'==szLine[1]) { } else { //找打key对应变量 strcpy(tmpstr,tmp+1); fclose(fp); returntmpstr; } } } else { strcpy(tmpstr,"["); strcat(tmpstr,title); strcat(tmpstr,"]"); if(strncmp(tmpstr,szLine,strlen(tmpstr))==0) { //找到title flag=1; } } } } fclose(fp); return""; } //从INI文件读取整类型数据 intGetIniKeyInt(char*title,char*key,char*filename) { returnatoi(GetIniKeyString(title,key,filename)); } intmain(intargc,char*argv[]) { charbuf[MAX_PATH]; memset(buf,0,sizeof(buf)); GetCurrentPath(buf,CONF_FILE_PATH); strcpy(g_szConfigPath,buf); intiCatAge; charszCatName[32]; iCatAge=GetIniKeyInt("CAT","age",g_szConfigPath); strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath)); return0; }
下边是配置文件:
[CAT] age=2 name=Tom
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!