C 语言实现读配置文件(.ini)函数,替代GetPrivateProfileString,WritePrivateProfileString
2013-01-24 10:57
573 查看
WritePrivateProfileString和GetPrivateProfileString函数是windows系统平台提供给我们的读写配置文件(.ini)的函数。由于其具有不可移植性,在Linux平台下不可用。所以现在用C语言重新实现了上述两个函数的功能,其参数和返回结果保持一样。
C++中函数原型如下:(详见MSDN)
c语言中新定义:
bool write_profile_string(
char* chAppName,
char* chKeyName,
char* chValue,
char* chFileName
);
int get_profile_string (
char* chAppName,
char* chKeyName,
char* chDefault,
char* chReturnedString,
int nSize,
char* chFileName
);
函数实现部分:
/******************************************************************************************/
#define INVALID_FILE_SIZE ((unsigned long)0xFFFFFFFF)
bool write_profile_string(char* chAppName,char* chKeyName,char* chValue,char* chFileName)
{
bool ret = true;
FILE *fp=NULL;
char* ReadBuffer=NULL,*WriteBuffer=NULL;
bool IsFindAppName=false,IsFindKeyName=false;
bool IsFileChanged=true;
char *szLineStart=NULL,*szLineEnd=NULL,*szEnd=NULL;
char *next_line=NULL,*szValueStart=NULL,*szValueEnd=NULL;
char *szSectionStart=NULL,*szSectionEnd=NULL;
int line=0;
int AppNameLen=0,KeyNameLen=0,ValueLen=0;
if (!chAppName) return ret=false;
if (!chFileName)return ret=false;
if (chAppName)
{
char *p;
while (isspace(((unsigned char)*chAppName))) chAppName++;
if (*chAppName)
p= chAppName +strlen(chAppName) -1 ;
else
p=chAppName;
while ((p > chAppName) && isspace((unsigned char)*p)) p--;
AppNameLen = (int)(p -chAppName) + 1;
}
if (chKeyName)
{
char *p;
while (isspace(((unsigned char)*chKeyName))) chKeyName++;
if (*chKeyName)
p= chKeyName +strlen(chKeyName) -1 ;
else
p=chKeyName;
while ((p > chKeyName) && isspace((unsigned char)*p)) p--;
KeyNameLen =(int)( p -chKeyName + 1);
}
if (chValue)
{
char *p;
while (isspace(((unsigned char)*chValue))) chValue++;
if (*chValue)
p= chValue +strlen(chValue) -1 ;
else
p=chValue;
ValueLen =(int)( p -chValue + 1);
}
char* PreSectionbuf=NULL;
char* CurSectionbuf=NULL;
char* RemainSectionbuf=NULL;
char tempAppName[1024]="";
char tempKeyName[1024]="";
char *TempValue;
if (-1==_access(chFileName,0))
fp=fopen(chFileName,"w+");
else
fp=fopen(chFileName,"r+");
if (!fp)
return ret=false;
fseek(fp,0,SEEK_END);
long nFileSize = ftell(fp);
fseek(fp,0,SEEK_SET);
if (nFileSize == INVALID_FILE_SIZE||nFileSize==0)
{
if (nFileSize==INVALID_FILE_SIZE) /*file is too large*/
{
fclose(fp);
return ret;
}
if (!chKeyName||!chValue) /* file is NULL, and keyName or chValue is NuLL too. do nothing but return*/
{
fclose(fp);
return ret;
}
else /* file is NULL, create a new Section */
{
int len=(int)(AppNameLen+KeyNameLen+ValueLen+ 3 + 2);
WriteBuffer=(char*)malloc(len + 1);
if (!WriteBuffer)
{
fclose(fp);
return ret;
}
memset(WriteBuffer,0,len + 1);
char *buf=WriteBuffer;
*buf++ ='[';
strncpy(WriteBuffer + 1,chAppName,AppNameLen);
buf +=strlen(buf);////
*buf++ =']';
*buf++ ='\n';
strncpy(WriteBuffer +3 +AppNameLen,chKeyName,KeyNameLen);
buf +=strlen(buf);
*buf++ = '=';
strncpy(WriteBuffer +4 +AppNameLen + KeyNameLen,chValue,ValueLen);
buf +=strlen(buf);
*buf++ ='\n';
if (!fprintf(fp,"%s",WriteBuffer,len))
ret=false;
free(WriteBuffer);
fclose(fp);
return ret;
}
}
else /* file is not NULL. copy all data to ReadBuffer*/
{
ReadBuffer =(char*)malloc(nFileSize);
if (!ReadBuffer)
{
fclose(fp);
return ret;
}
memset(ReadBuffer,0,nFileSize);
if (!fread(ReadBuffer,sizeof(char),nFileSize,fp))
{
fclose(fp);
free(ReadBuffer);
return ret;
}
}
int len=nFileSize;
len =(int) strlen(ReadBuffer);
int cur=0,i=0;
next_line = ReadBuffer;
szEnd = ReadBuffer + len;
while (next_line < szEnd) /* analysis ReadBuffer*/
{
szLineStart = next_line;
next_line = (char*)memchr(szLineStart,'\n',szEnd-szLineStart);
if (!next_line)
next_line = (char*)memchr(szLineStart, '\r', szEnd - szLineStart);
if (!next_line)
next_line = szEnd;
else
next_line++;
szLineEnd = next_line;
line++;
while (szLineStart < szLineEnd && isspace((unsigned char)*szLineStart)) szLineStart++;
while ((szLineEnd > szLineStart) && isspace((unsigned char)szLineEnd[-1])) szLineEnd--;
if (szLineStart >= szLineEnd) continue;
if (*szLineStart == '[')
/* section start*/
{
if (IsFindAppName) /* AppName is found, and keyName is not found, copy the */
{ /* remain Sections to RemainSectionbuf*/
len = (int)(szEnd - szLineStart);
RemainSectionbuf =(char* )malloc(len + 1);
if (!RemainSectionbuf)
{
fclose(fp);
free(ReadBuffer);
free(PreSectionbuf);
return ret;
}
strncpy(RemainSectionbuf,szLineStart,len);
RemainSectionbuf[len]='\0';
szSectionEnd = szLineStart-1;
break;
}
char *szAppNameEnd;
if ((szAppNameEnd = (char*)memchr( szLineStart, ']', szLineEnd - szLineStart )))
{
szLineStart++;
char * SecStart = szLineStart;
char * SecEnd = szAppNameEnd -1;
while (SecStart < szLineEnd && isspace((unsigned char)*SecStart)) SecStart++;
while ((SecEnd > SecStart) && isspace((unsigned char)*SecEnd)) SecEnd--;
len =(int) (SecEnd - SecStart + 1);
strncpy(tempAppName,SecStart,len);
tempAppName[len] = '\0';
if (chAppName)
{
if (0 == _strnicmp(tempAppName,chAppName,AppNameLen) && tempAppName[AppNameLen] == '\0') /* AppName is found, and store the previous section to PreSectionbuf*/
{
IsFindAppName = true;
len = (int) (szLineStart -2 - ReadBuffer + 1);
PreSectionbuf = (char*)malloc (len+1);
if (!PreSectionbuf)
{
free(ReadBuffer);
fclose(fp);
return ret;
}
memset(PreSectionbuf,0,len+1);
strncpy(PreSectionbuf,ReadBuffer,len);
szSectionStart = szLineStart - 1;
}
}
continue;
}
}
len =(int) (szLineEnd - szLineStart );
if ((szValueStart = (char*)memchr( szLineStart, '=', szLineEnd - szLineStart )) != NULL)
{
const char *szKeyNameEnd = szValueStart;
const char *EaqualSign =szValueStart;
while (szKeyNameEnd > szLineStart &&isspace((unsigned char)szKeyNameEnd[-1])) szKeyNameEnd--;
len =(int) (szKeyNameEnd - szLineStart);
szValueStart++;
while (szValueStart < szLineEnd && isspace((unsigned char)*szValueStart)) szValueStart++;
if (len > 0)
{
strncpy(tempKeyName,szLineStart,len);
tempKeyName[len] = '\0';
if ( chKeyName && IsFindAppName)
{
if (0 == _strnicmp(tempKeyName,chKeyName,KeyNameLen) && tempKeyName[KeyNameLen] == '\0') /* AppName and kyeName are found, copy the remain Entries and Sections*/
{ /* to RemainSectionbuf*/
IsFindKeyName = true;
if (szValueStart)
{
len = (int)(szLineEnd - szValueStart );
TempValue =(char*) malloc(len + 1);
if (!TempValue)
{
free(ReadBuffer);
free(PreSectionbuf);
fclose(fp);
return ret;
}
memcpy(TempValue, szValueStart, len * sizeof(char));
TempValue[len] = '\0';
}
else TempValue = NULL;
len =(int)( szEnd - szLineEnd);
RemainSectionbuf =(char* )malloc(len + 1);
if (!RemainSectionbuf)
{
free(ReadBuffer);
free(PreSectionbuf);
if (TempValue) free(TempValue);
fclose(fp);
return ret;
}
strncpy(RemainSectionbuf,szLineEnd,len);
RemainSectionbuf[len]='\0';
szSectionEnd = szLineEnd;
if (chValue) /*If chValue is Not NULL, change the current entry, and store current */
{ /*Section to CurSectionbuf*/
if (TempValue)
{
if (0 == strcmp(TempValue,chValue))
{
IsFileChanged =false;
free(TempValue);
break;
}
}
int len1 = (int) (szLineStart - szSectionStart);
int len2 = (int) (EaqualSign+1 - szLineStart);
len =len1 + len2+ ValueLen + 2;
CurSectionbuf =(char*) malloc(len +1);
if (!CurSectionbuf)
{
free(ReadBuffer);
free(PreSectionbuf);
free( RemainSectionbuf);
if (TempValue) free(RemainSectionbuf);
fclose(fp);
return ret;
}
memset(CurSectionbuf,0,len + 1);
strncpy(CurSectionbuf,szSectionStart,len1);
strncpy(CurSectionbuf +len1,szLineStart,len2);
strncpy(CurSectionbuf+ len1 +len2,chValue,ValueLen);
} /* If chValue is NULL, delete the current entry, and store current */
else /* Section to CurSectionbuf */
{
len = (int) (szLineStart - 1 - szSectionStart);
CurSectionbuf =(char*) malloc(len +1);
if (!CurSectionbuf)
{
free(ReadBuffer);
free (PreSectionbuf);
free(RemainSectionbuf);
if (TempValue) free(TempValue);
fclose(fp);
return ret;
}
memset(CurSectionbuf,0,len + 1);
strncpy(CurSectionbuf,szSectionStart,len);
}
if (TempValue) free(TempValue);
break;
}
}
}
}
}
if (IsFindKeyName && IsFileChanged) /* KeyName is found.*/
{
len = (int)strlen(PreSectionbuf);
len +=(int)strlen(CurSectionbuf);
len +=(int)strlen(RemainSectionbuf);
WriteBuffer = (char *)malloc(len+1);
if (!WriteBuffer)
{
free(ReadBuffer);
free(PreSectionbuf);
free(CurSectionbuf);
free(RemainSectionbuf);
fclose(fp);
return ret;
}
*WriteBuffer ='\0';
strcat(WriteBuffer,PreSectionbuf);
strcat(WriteBuffer,CurSectionbuf);
strcat(WriteBuffer,RemainSectionbuf);
WriteBuffer[len]='\0';
free(PreSectionbuf);
free(CurSectionbuf);
free(RemainSectionbuf);
}
else if (IsFindAppName&&!IsFindKeyName &&IsFileChanged)
{
if (!chKeyName) /*KeyName is NULL, delete all entries under the current Section.*/
{
len =(int) strlen(PreSectionbuf);
if(RemainSectionbuf) len +=(int)strlen(RemainSectionbuf);
WriteBuffer = (char *)malloc(len+1);
if (!WriteBuffer)
{
free(ReadBuffer);
free(PreSectionbuf);
if(RemainSectionbuf) free(RemainSectionbuf);
fclose(fp);
return ret;
}
*WriteBuffer ='\0';
strcat(WriteBuffer,PreSectionbuf);
if(RemainSectionbuf)
strcat(WriteBuffer,RemainSectionbuf);
WriteBuffer[len]='\0';
if(RemainSectionbuf) free(RemainSectionbuf);
free(PreSectionbuf);
}
else /*KeyName is not NULL*/
{
if (chValue) /* chValue is not NULL, create new entry at the end of the current section*/
{
char *buf;
if (szSectionEnd==NULL)
szSectionEnd = szEnd - 1;
buf =szSectionEnd;
int len1 = (int) (szSectionEnd - szSectionStart + 1);
while ( isspace((unsigned char)*szSectionEnd) ) szSectionEnd --;
int len2= (int)(buf - szSectionEnd);
int len3= (int) (szSectionEnd - szSectionStart+1);
len =len1 +1 + KeyNameLen + ValueLen + 1 +len2;
if (len2 <= 0) len += 1;
CurSectionbuf =(char*) malloc(len+1);
if (!CurSectionbuf)
{
free(ReadBuffer);
free(PreSectionbuf);
if(RemainSectionbuf) free(RemainSectionbuf);
fclose(fp);
return ret;
}
memset(CurSectionbuf,0,len+1);
strncpy(CurSectionbuf,szSectionStart,len3);
strcat(CurSectionbuf,"\n");
strncpy(CurSectionbuf + len3 +1,chKeyName,KeyNameLen);
strcat(CurSectionbuf,"=");
strncpy(CurSectionbuf + len3 + 1 + KeyNameLen + 1 ,chValue,ValueLen);
strncpy(CurSectionbuf+len3+KeyNameLen + ValueLen+2,szSectionEnd+1,len2);
if (len2 <= 0) strcat(CurSectionbuf,"\n");
len = (int)strlen(PreSectionbuf);
len +=(int)strlen(CurSectionbuf);
if(RemainSectionbuf) len +=(int)strlen(RemainSectionbuf);
WriteBuffer = (char *)malloc(len+1);
if (!WriteBuffer)
{
free(ReadBuffer);
free(PreSectionbuf);
free(CurSectionbuf);
if(RemainSectionbuf) free(RemainSectionbuf);
fclose(fp);
return ret;
}
*WriteBuffer ='\0';
strcat(WriteBuffer,PreSectionbuf);
strcat(WriteBuffer,CurSectionbuf);
if(RemainSectionbuf)
{
strcat(WriteBuffer,RemainSectionbuf);
free(RemainSectionbuf);
}
WriteBuffer[len]='\0';
free(PreSectionbuf);
free(CurSectionbuf);
}
else /*chValue is NULL, do nothing*/
{
IsFileChanged =false;
}
}
}
else if(!IsFindAppName&&!IsFindKeyName && IsFileChanged) /*if keyName and chValue are not NULL, Create new Section.*/
{
if (!chKeyName || !chValue)
IsFileChanged =false;
else
{
len=(int)(strlen(ReadBuffer) +AppNameLen+KeyNameLen+ValueLen+ 3 + 2);
WriteBuffer=(char*)malloc(len + 2);
if (!WriteBuffer)
{
free(ReadBuffer);
fclose(fp);
return ret;
}
memset(WriteBuffer,0,len + 2);
strncpy(WriteBuffer,ReadBuffer,strlen(ReadBuffer));
if (ReadBuffer[strlen(ReadBuffer)-1] !='\n')
strcat(WriteBuffer,"\n");
len =(int) strlen(WriteBuffer);
char *buf=WriteBuffer+len;
*buf++ ='[';
strncpy(WriteBuffer+ len +1,chAppName,AppNameLen);
buf +=strlen(buf);
*buf++ =']';
*buf++ ='\n';
strncpy(WriteBuffer +len +1+ AppNameLen +2,chKeyName,KeyNameLen);
buf +=strlen(buf);
*buf++ = '=';
strncpy(WriteBuffer+len +1+ AppNameLen +2 +KeyNameLen +1,chValue,ValueLen);
buf +=strlen(buf);
*buf++ ='\n';
}
}
fclose(fp);
if (!IsFileChanged)
{
if (WriteBuffer) free(WriteBuffer);
if (ReadBuffer) free(ReadBuffer);
if (CurSectionbuf) free(CurSectionbuf);
if (PreSectionbuf) free(PreSectionbuf);
if (RemainSectionbuf) free(RemainSectionbuf);
return ret=true;
}
if (WriteBuffer)
{
if (fp=fopen(chFileName,"w+"))
{
fseek(fp,0,SEEK_SET);
fprintf(fp,"%s",WriteBuffer,strlen(WriteBuffer));
fclose(fp);
}
free(WriteBuffer);
}
if(ReadBuffer) free(ReadBuffer);
ret =true;
return ret;
}
/******************************************************************************************/
unsigned int get_profile_string (char* chAppName,char* chKeyName,char* chDefault,char* chReturnedString,int nSize,char* chFileName)
{
FILE *fp=NULL;
unsigned int ret=0;
char *tempDefValue=NULL;
int AppNameLen=0,KeyNameLen=0;
if (!chReturnedString ||nSize<=1)
{
if (nSize == 1)
chReturnedString='\0';
return 0;
}
memset(chReturnedString,0,nSize*sizeof(char));
if (chDefault)
{
char *p = chDefault + strlen(chDefault) - 1;
while (p > chDefault && *p == ' ')
p--;
if (p >= chDefault)
{
int len = (int)(p - chDefault) + 1;
tempDefValue = (char*)malloc(len + 1);
strncpy(tempDefValue,chDefault,len);
tempDefValue[len] = '\0';
chDefault = tempDefValue;
}
}
else
chDefault = "\0";
if (chAppName)
{
char *p;
while (isspace((unsigned char)*chAppName)) chAppName++;
if (*chAppName)
p= chAppName +strlen(chAppName) -1 ;
else
p=chAppName;
while ((p > chAppName) && isspace((unsigned char)*p)) p--;
AppNameLen =(int) (p -chAppName + 1);
}
if (chKeyName)
{
char *p;
while (isspace((unsigned char)*chKeyName)) chKeyName++;
if (*chKeyName)
p= chKeyName +strlen(chKeyName) -1 ;
else
p=chKeyName;
while ((p > chKeyName) && isspace((unsigned char)*p)) p--;
KeyNameLen =(int) (p -chKeyName + 1);
}
if (!chFileName)
{
if(chAppName)
{
int len = (int)strlen(chDefault);
if(nSize<=len)
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize-1 ;
}
else
{
strncpy(chReturnedString,chDefault,len);
ret = len;
}
}
else
{
ret=0;
*chReturnedString='\0';
}
if (tempDefValue) free(tempDefValue);
return ret;
}
if (!(fp = fopen(chFileName, "r+")))
{
if(chAppName)
{
int len = (int)strlen(chDefault);
if(nSize<=len)
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize-1 ;
}
else
{
strncpy(chReturnedString,chDefault,len);
ret = len;
}
}
else
{
ret=0;
*chReturnedString='\0';
}
if (tempDefValue) free(tempDefValue);
return ret;
}
bool bIsFindAppName =false,bIsFindKeyName=false;;
char *ReadBuffer = NULL;
char *szLineStart=NULL,*szLineEnd=NULL, *szEnd= NULL;
char *next_line=NULL,*szValueStart=NULL;
char tempAppName[1024]="";
char tempKeyName[1024]="";
char *TempValue=NULL;
char * CopySectionName = (char*)malloc(nSize);
char * CopyKeyName = (char*)malloc(nSize);
if (!CopyKeyName || !CopySectionName)
{
fclose(fp);
if (tempDefValue) free(tempDefValue);
return 0;
}
char *p,*q;
int len=0;
int plen=nSize - 1,qlen=nSize - 1;
bool bSectionCopyOver=false, bEntryCopyOver=false;
memset(CopySectionName,0,nSize);
memset(CopyKeyName,0,nSize);
p = CopySectionName;
q = CopyKeyName;
fseek(fp,0,SEEK_END);
long nFileSize = ftell(fp);
fseek(fp,0,SEEK_SET);
if (nFileSize == INVALID_FILE_SIZE||nFileSize==0)
{
int len = (int)strlen(chDefault);
if(nSize<=len)
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize-1 ;
}
else
{
strncpy(chReturnedString,chDefault,len);
ret = len;
}
fclose(fp);
if (tempDefValue) free(tempDefValue);
return ret;
}
else
{
ReadBuffer =(char*)malloc(nFileSize+1);
if (!ReadBuffer)
{
fclose(fp);
if (tempDefValue) free(tempDefValue);
assert(" malloc failed!");//////
return ret;
}
memset(ReadBuffer,0,nFileSize+1);
if (!fread(ReadBuffer,sizeof(char),nFileSize,fp))
{
fclose(fp);
free(ReadBuffer);
if (tempDefValue) free(tempDefValue);
assert("file load failed!");//////
return ret;
}
}
len = (int)strlen(ReadBuffer);
next_line = ReadBuffer;
szEnd = ReadBuffer + len;
while (next_line < szEnd) // analysis ReadBuffer
{
szLineStart = next_line;
next_line = (char*)memchr(szLineStart,'\n',szEnd-szLineStart);
if (!next_line)
next_line = (char*)memchr(szLineStart, '\r', szEnd - szLineStart);
if (!next_line)
next_line = szEnd;
else
next_line++;
szLineEnd = next_line;
while (szLineStart < szLineEnd && isspace((unsigned char)*szLineStart)) szLineStart++;
while ((szLineEnd > szLineStart) && isspace((unsigned char)szLineEnd[-1])) szLineEnd--;
if (szLineStart >= szLineEnd) continue;
if (*szLineStart == '[')
/*section start*/
{
if (bIsFindAppName)
{
bEntryCopyOver = true;
}
const char *szAppNameEnd;
if ((szAppNameEnd = (char*)memchr( szLineStart, ']', szLineEnd - szLineStart )))
{
szLineStart++;
len =(int) (szAppNameEnd - szLineStart);
strncpy(tempAppName,szLineStart,len);
tempAppName[len] = '\0';
if (!bSectionCopyOver) /* Copy all SectionName to CopySectionName buffer*/
{
int templen = (int)strlen(tempAppName) +1;
if (templen >= plen)
{
if (plen > 0)
{
strncpy(p, tempAppName,plen);
p+= plen-1;
*p++='\0';
}
*p ='\0';
ret = nSize -2 ;
bSectionCopyOver=true;
}
else
{
strncpy(p, tempAppName, templen-1);
strncpy(p+templen-1,"\t",1);
}
p += templen;
plen -= templen;
}
if (chAppName)
{
if (0 == _strnicmp(tempAppName,chAppName,AppNameLen)
&& tempAppName[AppNameLen] == '\0') /* AppName is found */
bIsFindAppName = true;
}
continue;
}
}
len =(int) (szLineEnd - szLineStart) ;
if ((szValueStart = (char*)memchr( szLineStart, '=', szLineEnd - szLineStart)) != NULL)
{
const char *szKeyNameEnd = szValueStart;
while (szKeyNameEnd > szLineStart &&isspace((unsigned char)szKeyNameEnd[-1])) szKeyNameEnd--;
len = (int)(szKeyNameEnd - szLineStart);
szValueStart++;
while (szValueStart < szLineEnd && isspace((unsigned char)*szValueStart)) szValueStart++;
if (len > 0 && bIsFindAppName)
{
strncpy(tempKeyName,szLineStart,len);
tempKeyName[len] = '\0';
if (!bEntryCopyOver) /* if AppName is found ,copy All KeyName to CopyKeyName buffer*/
{
int templen =(int) strlen(tempKeyName) +1;
if (templen >= qlen)
{
if (qlen > 0)
{
strncpy(q, tempKeyName,qlen);
q+= qlen-1;
*q++='\0';
}
*q ='\0';
ret = nSize -2 ;
bEntryCopyOver =true;
}
else
{
strncpy(q, tempKeyName, templen-1);
strncpy(q+templen-1,"\t",1);
}
q += templen;
qlen -= templen;
}
if (chKeyName)
{
if (0 == _strnicmp(tempKeyName,chKeyName,KeyNameLen) && tempKeyName[KeyNameLen] == '\0') /* AppName and kyeName are found*/
{
bIsFindKeyName = true;
len = (int)(szLineEnd - szValueStart );
TempValue =(char*) malloc(len + 1);
memcpy(TempValue, szValueStart, len * sizeof(char));
TempValue[len] = '\0';
break;
}
}
}
}
}
if(bIsFindKeyName) /* KeyName is found */
{
if (TempValue)
{
len =(int) strlen(TempValue);
if (nSize>len)
{
strncpy(chReturnedString,TempValue,len);
ret =len;
}
else
{
strncpy(chReturnedString,TempValue,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize -1;
}
}
else
ret=0;
}
else if(bIsFindAppName) /* Section is found,but Entry is not found */
{
if (!chKeyName)
{
len =(int) strlen(CopyKeyName);
strncpy(chReturnedString,CopyKeyName,len);
ret =len;
}
else
{
len = (int)strlen(chDefault);
if (nSize>len)
{
strncpy(chReturnedString,chDefault,len);
ret =len;
}
else
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize -1; /* UnSure return nSize or nSize-1*/
}
}
}
else /* Section is not found*/
{
if (!chAppName)
{
len =(int) strlen(CopySectionName);
strncpy(chReturnedString,CopySectionName,len);
ret =len;
}
else
{
len = (int)strlen(chDefault);
if (nSize>len)
{
strncpy(chReturnedString,chDefault,len);
ret =len;
}
else
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize -1; /* UnSure return nSize or nSize-1*/
}
}
}
if(tempDefValue) free(tempDefValue);
if(CopySectionName) free(CopySectionName);
if(CopyKeyName) free(CopyKeyName);
if(ReadBuffer) free(ReadBuffer);
if(TempValue) free(TempValue);
fclose(fp);
return ret;
}
/******************************************************************************************************************************************************/
测试:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define Max_Size 100
int _tmain(int argc, _TCHAR* argv[])
{
char* strFileName="config.ini";
char* chAppName="DataSource_Local";
char* chKeyName="ipAdress";
char* chKeyValue="127.0.0.1";
write_profile_string(chAppName,chKeyName,chKeyValue,strFileName);
write_profile_string("DataSource_Local","Port","27017",strFileName);
write_profile_string("DataSource","Port","1012",strFileName);
char *chValue=(char*)malloc(Max_Size*sizeof(char));
get_profile_string ("DataSource_Local","ipadress","127.0.0.1",chValue,Max_Size,strFileName);
free(chValue);
return 0;
}
.ini 文件
[DataSource_Local]
ipAdress=127.0.0.1
Port=27017
[DataSource]
Port=1012
debug:
1>c:\users\administrator\desktop\readconfig\readconfig\readconfig.cpp(39) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
See online help for details.
1> c:\program files (x86)\microsoft visual studio 8\vc\include\string.h(74) : see declaration of 'strcpy'
1>c:\users\administrator\desktop\readconfig\readconfig\readconfig.cpp(40) : warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 8\vc\include\string.h(79) : see declaration of 'strcat'
1>c:\users\administrator\desktop\readconfig\readconfig\readconfig.cpp(44) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
由于strcpy这类函数的不安全性,会产生一大堆的警告信息,如上。解决办法:在工程属性中的c/c++选项的Command Line 中添加上 D/"_CRT_SECURE_NO_WARNINGS" 就OK。
C++中函数原型如下:(详见MSDN)
BOOL WINAPI WritePrivateProfileString( _In_ LPCTSTR lpAppName, _In_ LPCTSTR lpKeyName, _In_ LPCTSTR lpString, _In_ LPCTSTR lpFileName );
DWORD WINAPI GetPrivateProfileString( _In_ LPCTSTR lpAppName, _In_ LPCTSTR lpKeyName, _In_ LPCTSTR lpDefault, _Out_ LPTSTR lpReturnedString, _In_ DWORD nSize, _In_ LPCTSTR lpFileName );
c语言中新定义:
bool write_profile_string(
char* chAppName,
char* chKeyName,
char* chValue,
char* chFileName
);
int get_profile_string (
char* chAppName,
char* chKeyName,
char* chDefault,
char* chReturnedString,
int nSize,
char* chFileName
);
函数实现部分:
/******************************************************************************************/
#define INVALID_FILE_SIZE ((unsigned long)0xFFFFFFFF)
bool write_profile_string(char* chAppName,char* chKeyName,char* chValue,char* chFileName)
{
bool ret = true;
FILE *fp=NULL;
char* ReadBuffer=NULL,*WriteBuffer=NULL;
bool IsFindAppName=false,IsFindKeyName=false;
bool IsFileChanged=true;
char *szLineStart=NULL,*szLineEnd=NULL,*szEnd=NULL;
char *next_line=NULL,*szValueStart=NULL,*szValueEnd=NULL;
char *szSectionStart=NULL,*szSectionEnd=NULL;
int line=0;
int AppNameLen=0,KeyNameLen=0,ValueLen=0;
if (!chAppName) return ret=false;
if (!chFileName)return ret=false;
if (chAppName)
{
char *p;
while (isspace(((unsigned char)*chAppName))) chAppName++;
if (*chAppName)
p= chAppName +strlen(chAppName) -1 ;
else
p=chAppName;
while ((p > chAppName) && isspace((unsigned char)*p)) p--;
AppNameLen = (int)(p -chAppName) + 1;
}
if (chKeyName)
{
char *p;
while (isspace(((unsigned char)*chKeyName))) chKeyName++;
if (*chKeyName)
p= chKeyName +strlen(chKeyName) -1 ;
else
p=chKeyName;
while ((p > chKeyName) && isspace((unsigned char)*p)) p--;
KeyNameLen =(int)( p -chKeyName + 1);
}
if (chValue)
{
char *p;
while (isspace(((unsigned char)*chValue))) chValue++;
if (*chValue)
p= chValue +strlen(chValue) -1 ;
else
p=chValue;
ValueLen =(int)( p -chValue + 1);
}
char* PreSectionbuf=NULL;
char* CurSectionbuf=NULL;
char* RemainSectionbuf=NULL;
char tempAppName[1024]="";
char tempKeyName[1024]="";
char *TempValue;
if (-1==_access(chFileName,0))
fp=fopen(chFileName,"w+");
else
fp=fopen(chFileName,"r+");
if (!fp)
return ret=false;
fseek(fp,0,SEEK_END);
long nFileSize = ftell(fp);
fseek(fp,0,SEEK_SET);
if (nFileSize == INVALID_FILE_SIZE||nFileSize==0)
{
if (nFileSize==INVALID_FILE_SIZE) /*file is too large*/
{
fclose(fp);
return ret;
}
if (!chKeyName||!chValue) /* file is NULL, and keyName or chValue is NuLL too. do nothing but return*/
{
fclose(fp);
return ret;
}
else /* file is NULL, create a new Section */
{
int len=(int)(AppNameLen+KeyNameLen+ValueLen+ 3 + 2);
WriteBuffer=(char*)malloc(len + 1);
if (!WriteBuffer)
{
fclose(fp);
return ret;
}
memset(WriteBuffer,0,len + 1);
char *buf=WriteBuffer;
*buf++ ='[';
strncpy(WriteBuffer + 1,chAppName,AppNameLen);
buf +=strlen(buf);////
*buf++ =']';
*buf++ ='\n';
strncpy(WriteBuffer +3 +AppNameLen,chKeyName,KeyNameLen);
buf +=strlen(buf);
*buf++ = '=';
strncpy(WriteBuffer +4 +AppNameLen + KeyNameLen,chValue,ValueLen);
buf +=strlen(buf);
*buf++ ='\n';
if (!fprintf(fp,"%s",WriteBuffer,len))
ret=false;
free(WriteBuffer);
fclose(fp);
return ret;
}
}
else /* file is not NULL. copy all data to ReadBuffer*/
{
ReadBuffer =(char*)malloc(nFileSize);
if (!ReadBuffer)
{
fclose(fp);
return ret;
}
memset(ReadBuffer,0,nFileSize);
if (!fread(ReadBuffer,sizeof(char),nFileSize,fp))
{
fclose(fp);
free(ReadBuffer);
return ret;
}
}
int len=nFileSize;
len =(int) strlen(ReadBuffer);
int cur=0,i=0;
next_line = ReadBuffer;
szEnd = ReadBuffer + len;
while (next_line < szEnd) /* analysis ReadBuffer*/
{
szLineStart = next_line;
next_line = (char*)memchr(szLineStart,'\n',szEnd-szLineStart);
if (!next_line)
next_line = (char*)memchr(szLineStart, '\r', szEnd - szLineStart);
if (!next_line)
next_line = szEnd;
else
next_line++;
szLineEnd = next_line;
line++;
while (szLineStart < szLineEnd && isspace((unsigned char)*szLineStart)) szLineStart++;
while ((szLineEnd > szLineStart) && isspace((unsigned char)szLineEnd[-1])) szLineEnd--;
if (szLineStart >= szLineEnd) continue;
if (*szLineStart == '[')
/* section start*/
{
if (IsFindAppName) /* AppName is found, and keyName is not found, copy the */
{ /* remain Sections to RemainSectionbuf*/
len = (int)(szEnd - szLineStart);
RemainSectionbuf =(char* )malloc(len + 1);
if (!RemainSectionbuf)
{
fclose(fp);
free(ReadBuffer);
free(PreSectionbuf);
return ret;
}
strncpy(RemainSectionbuf,szLineStart,len);
RemainSectionbuf[len]='\0';
szSectionEnd = szLineStart-1;
break;
}
char *szAppNameEnd;
if ((szAppNameEnd = (char*)memchr( szLineStart, ']', szLineEnd - szLineStart )))
{
szLineStart++;
char * SecStart = szLineStart;
char * SecEnd = szAppNameEnd -1;
while (SecStart < szLineEnd && isspace((unsigned char)*SecStart)) SecStart++;
while ((SecEnd > SecStart) && isspace((unsigned char)*SecEnd)) SecEnd--;
len =(int) (SecEnd - SecStart + 1);
strncpy(tempAppName,SecStart,len);
tempAppName[len] = '\0';
if (chAppName)
{
if (0 == _strnicmp(tempAppName,chAppName,AppNameLen) && tempAppName[AppNameLen] == '\0') /* AppName is found, and store the previous section to PreSectionbuf*/
{
IsFindAppName = true;
len = (int) (szLineStart -2 - ReadBuffer + 1);
PreSectionbuf = (char*)malloc (len+1);
if (!PreSectionbuf)
{
free(ReadBuffer);
fclose(fp);
return ret;
}
memset(PreSectionbuf,0,len+1);
strncpy(PreSectionbuf,ReadBuffer,len);
szSectionStart = szLineStart - 1;
}
}
continue;
}
}
len =(int) (szLineEnd - szLineStart );
if ((szValueStart = (char*)memchr( szLineStart, '=', szLineEnd - szLineStart )) != NULL)
{
const char *szKeyNameEnd = szValueStart;
const char *EaqualSign =szValueStart;
while (szKeyNameEnd > szLineStart &&isspace((unsigned char)szKeyNameEnd[-1])) szKeyNameEnd--;
len =(int) (szKeyNameEnd - szLineStart);
szValueStart++;
while (szValueStart < szLineEnd && isspace((unsigned char)*szValueStart)) szValueStart++;
if (len > 0)
{
strncpy(tempKeyName,szLineStart,len);
tempKeyName[len] = '\0';
if ( chKeyName && IsFindAppName)
{
if (0 == _strnicmp(tempKeyName,chKeyName,KeyNameLen) && tempKeyName[KeyNameLen] == '\0') /* AppName and kyeName are found, copy the remain Entries and Sections*/
{ /* to RemainSectionbuf*/
IsFindKeyName = true;
if (szValueStart)
{
len = (int)(szLineEnd - szValueStart );
TempValue =(char*) malloc(len + 1);
if (!TempValue)
{
free(ReadBuffer);
free(PreSectionbuf);
fclose(fp);
return ret;
}
memcpy(TempValue, szValueStart, len * sizeof(char));
TempValue[len] = '\0';
}
else TempValue = NULL;
len =(int)( szEnd - szLineEnd);
RemainSectionbuf =(char* )malloc(len + 1);
if (!RemainSectionbuf)
{
free(ReadBuffer);
free(PreSectionbuf);
if (TempValue) free(TempValue);
fclose(fp);
return ret;
}
strncpy(RemainSectionbuf,szLineEnd,len);
RemainSectionbuf[len]='\0';
szSectionEnd = szLineEnd;
if (chValue) /*If chValue is Not NULL, change the current entry, and store current */
{ /*Section to CurSectionbuf*/
if (TempValue)
{
if (0 == strcmp(TempValue,chValue))
{
IsFileChanged =false;
free(TempValue);
break;
}
}
int len1 = (int) (szLineStart - szSectionStart);
int len2 = (int) (EaqualSign+1 - szLineStart);
len =len1 + len2+ ValueLen + 2;
CurSectionbuf =(char*) malloc(len +1);
if (!CurSectionbuf)
{
free(ReadBuffer);
free(PreSectionbuf);
free( RemainSectionbuf);
if (TempValue) free(RemainSectionbuf);
fclose(fp);
return ret;
}
memset(CurSectionbuf,0,len + 1);
strncpy(CurSectionbuf,szSectionStart,len1);
strncpy(CurSectionbuf +len1,szLineStart,len2);
strncpy(CurSectionbuf+ len1 +len2,chValue,ValueLen);
} /* If chValue is NULL, delete the current entry, and store current */
else /* Section to CurSectionbuf */
{
len = (int) (szLineStart - 1 - szSectionStart);
CurSectionbuf =(char*) malloc(len +1);
if (!CurSectionbuf)
{
free(ReadBuffer);
free (PreSectionbuf);
free(RemainSectionbuf);
if (TempValue) free(TempValue);
fclose(fp);
return ret;
}
memset(CurSectionbuf,0,len + 1);
strncpy(CurSectionbuf,szSectionStart,len);
}
if (TempValue) free(TempValue);
break;
}
}
}
}
}
if (IsFindKeyName && IsFileChanged) /* KeyName is found.*/
{
len = (int)strlen(PreSectionbuf);
len +=(int)strlen(CurSectionbuf);
len +=(int)strlen(RemainSectionbuf);
WriteBuffer = (char *)malloc(len+1);
if (!WriteBuffer)
{
free(ReadBuffer);
free(PreSectionbuf);
free(CurSectionbuf);
free(RemainSectionbuf);
fclose(fp);
return ret;
}
*WriteBuffer ='\0';
strcat(WriteBuffer,PreSectionbuf);
strcat(WriteBuffer,CurSectionbuf);
strcat(WriteBuffer,RemainSectionbuf);
WriteBuffer[len]='\0';
free(PreSectionbuf);
free(CurSectionbuf);
free(RemainSectionbuf);
}
else if (IsFindAppName&&!IsFindKeyName &&IsFileChanged)
{
if (!chKeyName) /*KeyName is NULL, delete all entries under the current Section.*/
{
len =(int) strlen(PreSectionbuf);
if(RemainSectionbuf) len +=(int)strlen(RemainSectionbuf);
WriteBuffer = (char *)malloc(len+1);
if (!WriteBuffer)
{
free(ReadBuffer);
free(PreSectionbuf);
if(RemainSectionbuf) free(RemainSectionbuf);
fclose(fp);
return ret;
}
*WriteBuffer ='\0';
strcat(WriteBuffer,PreSectionbuf);
if(RemainSectionbuf)
strcat(WriteBuffer,RemainSectionbuf);
WriteBuffer[len]='\0';
if(RemainSectionbuf) free(RemainSectionbuf);
free(PreSectionbuf);
}
else /*KeyName is not NULL*/
{
if (chValue) /* chValue is not NULL, create new entry at the end of the current section*/
{
char *buf;
if (szSectionEnd==NULL)
szSectionEnd = szEnd - 1;
buf =szSectionEnd;
int len1 = (int) (szSectionEnd - szSectionStart + 1);
while ( isspace((unsigned char)*szSectionEnd) ) szSectionEnd --;
int len2= (int)(buf - szSectionEnd);
int len3= (int) (szSectionEnd - szSectionStart+1);
len =len1 +1 + KeyNameLen + ValueLen + 1 +len2;
if (len2 <= 0) len += 1;
CurSectionbuf =(char*) malloc(len+1);
if (!CurSectionbuf)
{
free(ReadBuffer);
free(PreSectionbuf);
if(RemainSectionbuf) free(RemainSectionbuf);
fclose(fp);
return ret;
}
memset(CurSectionbuf,0,len+1);
strncpy(CurSectionbuf,szSectionStart,len3);
strcat(CurSectionbuf,"\n");
strncpy(CurSectionbuf + len3 +1,chKeyName,KeyNameLen);
strcat(CurSectionbuf,"=");
strncpy(CurSectionbuf + len3 + 1 + KeyNameLen + 1 ,chValue,ValueLen);
strncpy(CurSectionbuf+len3+KeyNameLen + ValueLen+2,szSectionEnd+1,len2);
if (len2 <= 0) strcat(CurSectionbuf,"\n");
len = (int)strlen(PreSectionbuf);
len +=(int)strlen(CurSectionbuf);
if(RemainSectionbuf) len +=(int)strlen(RemainSectionbuf);
WriteBuffer = (char *)malloc(len+1);
if (!WriteBuffer)
{
free(ReadBuffer);
free(PreSectionbuf);
free(CurSectionbuf);
if(RemainSectionbuf) free(RemainSectionbuf);
fclose(fp);
return ret;
}
*WriteBuffer ='\0';
strcat(WriteBuffer,PreSectionbuf);
strcat(WriteBuffer,CurSectionbuf);
if(RemainSectionbuf)
{
strcat(WriteBuffer,RemainSectionbuf);
free(RemainSectionbuf);
}
WriteBuffer[len]='\0';
free(PreSectionbuf);
free(CurSectionbuf);
}
else /*chValue is NULL, do nothing*/
{
IsFileChanged =false;
}
}
}
else if(!IsFindAppName&&!IsFindKeyName && IsFileChanged) /*if keyName and chValue are not NULL, Create new Section.*/
{
if (!chKeyName || !chValue)
IsFileChanged =false;
else
{
len=(int)(strlen(ReadBuffer) +AppNameLen+KeyNameLen+ValueLen+ 3 + 2);
WriteBuffer=(char*)malloc(len + 2);
if (!WriteBuffer)
{
free(ReadBuffer);
fclose(fp);
return ret;
}
memset(WriteBuffer,0,len + 2);
strncpy(WriteBuffer,ReadBuffer,strlen(ReadBuffer));
if (ReadBuffer[strlen(ReadBuffer)-1] !='\n')
strcat(WriteBuffer,"\n");
len =(int) strlen(WriteBuffer);
char *buf=WriteBuffer+len;
*buf++ ='[';
strncpy(WriteBuffer+ len +1,chAppName,AppNameLen);
buf +=strlen(buf);
*buf++ =']';
*buf++ ='\n';
strncpy(WriteBuffer +len +1+ AppNameLen +2,chKeyName,KeyNameLen);
buf +=strlen(buf);
*buf++ = '=';
strncpy(WriteBuffer+len +1+ AppNameLen +2 +KeyNameLen +1,chValue,ValueLen);
buf +=strlen(buf);
*buf++ ='\n';
}
}
fclose(fp);
if (!IsFileChanged)
{
if (WriteBuffer) free(WriteBuffer);
if (ReadBuffer) free(ReadBuffer);
if (CurSectionbuf) free(CurSectionbuf);
if (PreSectionbuf) free(PreSectionbuf);
if (RemainSectionbuf) free(RemainSectionbuf);
return ret=true;
}
if (WriteBuffer)
{
if (fp=fopen(chFileName,"w+"))
{
fseek(fp,0,SEEK_SET);
fprintf(fp,"%s",WriteBuffer,strlen(WriteBuffer));
fclose(fp);
}
free(WriteBuffer);
}
if(ReadBuffer) free(ReadBuffer);
ret =true;
return ret;
}
/******************************************************************************************/
unsigned int get_profile_string (char* chAppName,char* chKeyName,char* chDefault,char* chReturnedString,int nSize,char* chFileName)
{
FILE *fp=NULL;
unsigned int ret=0;
char *tempDefValue=NULL;
int AppNameLen=0,KeyNameLen=0;
if (!chReturnedString ||nSize<=1)
{
if (nSize == 1)
chReturnedString='\0';
return 0;
}
memset(chReturnedString,0,nSize*sizeof(char));
if (chDefault)
{
char *p = chDefault + strlen(chDefault) - 1;
while (p > chDefault && *p == ' ')
p--;
if (p >= chDefault)
{
int len = (int)(p - chDefault) + 1;
tempDefValue = (char*)malloc(len + 1);
strncpy(tempDefValue,chDefault,len);
tempDefValue[len] = '\0';
chDefault = tempDefValue;
}
}
else
chDefault = "\0";
if (chAppName)
{
char *p;
while (isspace((unsigned char)*chAppName)) chAppName++;
if (*chAppName)
p= chAppName +strlen(chAppName) -1 ;
else
p=chAppName;
while ((p > chAppName) && isspace((unsigned char)*p)) p--;
AppNameLen =(int) (p -chAppName + 1);
}
if (chKeyName)
{
char *p;
while (isspace((unsigned char)*chKeyName)) chKeyName++;
if (*chKeyName)
p= chKeyName +strlen(chKeyName) -1 ;
else
p=chKeyName;
while ((p > chKeyName) && isspace((unsigned char)*p)) p--;
KeyNameLen =(int) (p -chKeyName + 1);
}
if (!chFileName)
{
if(chAppName)
{
int len = (int)strlen(chDefault);
if(nSize<=len)
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize-1 ;
}
else
{
strncpy(chReturnedString,chDefault,len);
ret = len;
}
}
else
{
ret=0;
*chReturnedString='\0';
}
if (tempDefValue) free(tempDefValue);
return ret;
}
if (!(fp = fopen(chFileName, "r+")))
{
if(chAppName)
{
int len = (int)strlen(chDefault);
if(nSize<=len)
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize-1 ;
}
else
{
strncpy(chReturnedString,chDefault,len);
ret = len;
}
}
else
{
ret=0;
*chReturnedString='\0';
}
if (tempDefValue) free(tempDefValue);
return ret;
}
bool bIsFindAppName =false,bIsFindKeyName=false;;
char *ReadBuffer = NULL;
char *szLineStart=NULL,*szLineEnd=NULL, *szEnd= NULL;
char *next_line=NULL,*szValueStart=NULL;
char tempAppName[1024]="";
char tempKeyName[1024]="";
char *TempValue=NULL;
char * CopySectionName = (char*)malloc(nSize);
char * CopyKeyName = (char*)malloc(nSize);
if (!CopyKeyName || !CopySectionName)
{
fclose(fp);
if (tempDefValue) free(tempDefValue);
return 0;
}
char *p,*q;
int len=0;
int plen=nSize - 1,qlen=nSize - 1;
bool bSectionCopyOver=false, bEntryCopyOver=false;
memset(CopySectionName,0,nSize);
memset(CopyKeyName,0,nSize);
p = CopySectionName;
q = CopyKeyName;
fseek(fp,0,SEEK_END);
long nFileSize = ftell(fp);
fseek(fp,0,SEEK_SET);
if (nFileSize == INVALID_FILE_SIZE||nFileSize==0)
{
int len = (int)strlen(chDefault);
if(nSize<=len)
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize-1 ;
}
else
{
strncpy(chReturnedString,chDefault,len);
ret = len;
}
fclose(fp);
if (tempDefValue) free(tempDefValue);
return ret;
}
else
{
ReadBuffer =(char*)malloc(nFileSize+1);
if (!ReadBuffer)
{
fclose(fp);
if (tempDefValue) free(tempDefValue);
assert(" malloc failed!");//////
return ret;
}
memset(ReadBuffer,0,nFileSize+1);
if (!fread(ReadBuffer,sizeof(char),nFileSize,fp))
{
fclose(fp);
free(ReadBuffer);
if (tempDefValue) free(tempDefValue);
assert("file load failed!");//////
return ret;
}
}
len = (int)strlen(ReadBuffer);
next_line = ReadBuffer;
szEnd = ReadBuffer + len;
while (next_line < szEnd) // analysis ReadBuffer
{
szLineStart = next_line;
next_line = (char*)memchr(szLineStart,'\n',szEnd-szLineStart);
if (!next_line)
next_line = (char*)memchr(szLineStart, '\r', szEnd - szLineStart);
if (!next_line)
next_line = szEnd;
else
next_line++;
szLineEnd = next_line;
while (szLineStart < szLineEnd && isspace((unsigned char)*szLineStart)) szLineStart++;
while ((szLineEnd > szLineStart) && isspace((unsigned char)szLineEnd[-1])) szLineEnd--;
if (szLineStart >= szLineEnd) continue;
if (*szLineStart == '[')
/*section start*/
{
if (bIsFindAppName)
{
bEntryCopyOver = true;
}
const char *szAppNameEnd;
if ((szAppNameEnd = (char*)memchr( szLineStart, ']', szLineEnd - szLineStart )))
{
szLineStart++;
len =(int) (szAppNameEnd - szLineStart);
strncpy(tempAppName,szLineStart,len);
tempAppName[len] = '\0';
if (!bSectionCopyOver) /* Copy all SectionName to CopySectionName buffer*/
{
int templen = (int)strlen(tempAppName) +1;
if (templen >= plen)
{
if (plen > 0)
{
strncpy(p, tempAppName,plen);
p+= plen-1;
*p++='\0';
}
*p ='\0';
ret = nSize -2 ;
bSectionCopyOver=true;
}
else
{
strncpy(p, tempAppName, templen-1);
strncpy(p+templen-1,"\t",1);
}
p += templen;
plen -= templen;
}
if (chAppName)
{
if (0 == _strnicmp(tempAppName,chAppName,AppNameLen)
&& tempAppName[AppNameLen] == '\0') /* AppName is found */
bIsFindAppName = true;
}
continue;
}
}
len =(int) (szLineEnd - szLineStart) ;
if ((szValueStart = (char*)memchr( szLineStart, '=', szLineEnd - szLineStart)) != NULL)
{
const char *szKeyNameEnd = szValueStart;
while (szKeyNameEnd > szLineStart &&isspace((unsigned char)szKeyNameEnd[-1])) szKeyNameEnd--;
len = (int)(szKeyNameEnd - szLineStart);
szValueStart++;
while (szValueStart < szLineEnd && isspace((unsigned char)*szValueStart)) szValueStart++;
if (len > 0 && bIsFindAppName)
{
strncpy(tempKeyName,szLineStart,len);
tempKeyName[len] = '\0';
if (!bEntryCopyOver) /* if AppName is found ,copy All KeyName to CopyKeyName buffer*/
{
int templen =(int) strlen(tempKeyName) +1;
if (templen >= qlen)
{
if (qlen > 0)
{
strncpy(q, tempKeyName,qlen);
q+= qlen-1;
*q++='\0';
}
*q ='\0';
ret = nSize -2 ;
bEntryCopyOver =true;
}
else
{
strncpy(q, tempKeyName, templen-1);
strncpy(q+templen-1,"\t",1);
}
q += templen;
qlen -= templen;
}
if (chKeyName)
{
if (0 == _strnicmp(tempKeyName,chKeyName,KeyNameLen) && tempKeyName[KeyNameLen] == '\0') /* AppName and kyeName are found*/
{
bIsFindKeyName = true;
len = (int)(szLineEnd - szValueStart );
TempValue =(char*) malloc(len + 1);
memcpy(TempValue, szValueStart, len * sizeof(char));
TempValue[len] = '\0';
break;
}
}
}
}
}
if(bIsFindKeyName) /* KeyName is found */
{
if (TempValue)
{
len =(int) strlen(TempValue);
if (nSize>len)
{
strncpy(chReturnedString,TempValue,len);
ret =len;
}
else
{
strncpy(chReturnedString,TempValue,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize -1;
}
}
else
ret=0;
}
else if(bIsFindAppName) /* Section is found,but Entry is not found */
{
if (!chKeyName)
{
len =(int) strlen(CopyKeyName);
strncpy(chReturnedString,CopyKeyName,len);
ret =len;
}
else
{
len = (int)strlen(chDefault);
if (nSize>len)
{
strncpy(chReturnedString,chDefault,len);
ret =len;
}
else
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize -1; /* UnSure return nSize or nSize-1*/
}
}
}
else /* Section is not found*/
{
if (!chAppName)
{
len =(int) strlen(CopySectionName);
strncpy(chReturnedString,CopySectionName,len);
ret =len;
}
else
{
len = (int)strlen(chDefault);
if (nSize>len)
{
strncpy(chReturnedString,chDefault,len);
ret =len;
}
else
{
strncpy(chReturnedString,chDefault,nSize-1);
chReturnedString[nSize-1]='\0';
ret = nSize -1; /* UnSure return nSize or nSize-1*/
}
}
}
if(tempDefValue) free(tempDefValue);
if(CopySectionName) free(CopySectionName);
if(CopyKeyName) free(CopyKeyName);
if(ReadBuffer) free(ReadBuffer);
if(TempValue) free(TempValue);
fclose(fp);
return ret;
}
/******************************************************************************************************************************************************/
测试:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define Max_Size 100
int _tmain(int argc, _TCHAR* argv[])
{
char* strFileName="config.ini";
char* chAppName="DataSource_Local";
char* chKeyName="ipAdress";
char* chKeyValue="127.0.0.1";
write_profile_string(chAppName,chKeyName,chKeyValue,strFileName);
write_profile_string("DataSource_Local","Port","27017",strFileName);
write_profile_string("DataSource","Port","1012",strFileName);
char *chValue=(char*)malloc(Max_Size*sizeof(char));
get_profile_string ("DataSource_Local","ipadress","127.0.0.1",chValue,Max_Size,strFileName);
free(chValue);
return 0;
}
.ini 文件
[DataSource_Local]
ipAdress=127.0.0.1
Port=27017
[DataSource]
Port=1012
debug:
1>c:\users\administrator\desktop\readconfig\readconfig\readconfig.cpp(39) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
See online help for details.
1> c:\program files (x86)\microsoft visual studio 8\vc\include\string.h(74) : see declaration of 'strcpy'
1>c:\users\administrator\desktop\readconfig\readconfig\readconfig.cpp(40) : warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 8\vc\include\string.h(79) : see declaration of 'strcat'
1>c:\users\administrator\desktop\readconfig\readconfig\readconfig.cpp(44) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
由于strcpy这类函数的不安全性,会产生一大堆的警告信息,如上。解决办法:在工程属性中的c/c++选项的Command Line 中添加上 D/"_CRT_SECURE_NO_WARNINGS" 就OK。
相关文章推荐
- 利用WritePrivateProfileString和GetPrivateProfileString读写配置文件.ini
- MFC读写ini配置文件(WritePrivateProfileString,GetPrivateProfileString,GetPrivateProfileInt)
- 【转载】C++读写ini配置文件GetPrivateProfileString()&WritePrivateProfileString()
- 写入配置的函数WritePrivateProfileString和读取配置文件的函数GetPrivateProfileInt和GetPrivateProfileString
- c++ stl实现对配置文件的读写 根据windows API WritePrivateProfileString,GetPrivateProfileString简单改写
- WritePrivateProfileString和GetPrivateProfileString读写ini配置文件
- 利用GetPrivateProfileString/WritePrivateProfileString读写配置文件(.ini)
- C++读写ini配置文件GetPrivateProfileString()&WritePrivateProfileString()
- C++读写ini配置文件GetPrivateProfileString()&WritePrivateProfileString()
- 简述配置文件ini及其操作函数GetPrivateProfileString等
- 读取INI配置文件GetProfileString和GetPrivateProfileString参数说明和示例
- WritePrivateProfileString等读写.ini配置文件
- INI文件编程,WINAPI函数WritePrivateProfileString,GetPrivateProfileString
- 利用GetPrivateProfileString读取配置文件(.ini)
- WritePrivateProfileString等读写.ini配置文件
- 利用GetPrivateProfileString读取配置文件(.ini)
- 利用GetPrivateProfileString读取配置文件(.ini)
- 利用GetPrivateProfileString读取配置文件(.ini)
- 利用GetPrivateProfileString读取配置文件(.ini)
- WritePrivateProfileString等读写.ini配置文件