ini 配置文件读取程序(C语言)
写个读ini文件的小接口,存下来备用。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #define KEYVALLEN 64 static int trim(char * buf) { if(!buf)return 0; char *p1,*p2; p1=p2=buf; while(p2 && *p2!='\0'){ if(!isspace(*p2) && p1<p2) *p1=*p2,p1++; else if(!isspace(*p2) && p1==p2) p1++; p2++; } *p1='\0'; return strlen(buf); } int GetToken( char *profile, char *AppName, char *KeyName, char *KeyVal) { char appname[20],keyname[20]; char buf[KEYVALLEN],*c; FILE *fp; int found=0; /* 1 AppName 2 KeyName */ if( (fp=fopen( profile,"r" ))==NULL ){ printf( "openfile [%s] error [%s]\n", profile,strerror(errno) ); return(-1); } fseek( fp, 0, SEEK_SET ); sprintf( appname,"[%s]", AppName ); memset( keyname, 0, sizeof(keyname) ); while( !feof(fp) && fgets( buf, KEYVALLEN, fp )!=NULL ){ if(trim( buf )==0) continue; if( found==0 ){ if( buf[0]!='[' ) { continue; } else if ( strncmp(buf,appname,strlen(appname))==0 ){ found=1; continue; } } else if( found==1 ){ if( buf[0]=='#' ){ continue; } else if ( buf[0]=='[' ) { break; } else { if( (c=(char*)strchr(buf,'='))==NULL ) continue; memset( keyname, 0, sizeof(keyname) ); sscanf( buf, "%[^=]", keyname ); if( strcmp(keyname, KeyName)==0 ){ sscanf( ++c, "%[^\n]", KeyVal ); found=2; break; } else { continue; } } } } fclose( fp ); if( found==2 ) return(0); else return(-1); } int main(void) { char * app="LOG"; char * keyname="errorlog"; char keyval[KEYVALLEN] = {'\0'}; int ret = 0; ret = GetToken("ddgcsync.conf",app,keyname,keyval); if(ret<0) { printf("no token found \n "); }else{ printf("value = %s\n",keyval); } return 0; }
trim用来去除buf中所有的space。
测试:
ddgcsync.conf:
[ CONFIG ]
dir = syncdir. conf
ipring = syncipring. conf
[ LOG ]
synclog = ddgc_sync_file.log
errorlog = ddgc_sync_error.log
运行结果:
value = ddgc_sync_error.log