您的位置:首页 > 编程语言 > PHP开发

VC遍历INI配置文件

2013-08-27 14:28 85 查看
在VC中对INI的操作函数很少,为了能够达到遍历INI的目的,有很多人选择用CFile来重新解析INI以达到遍历的目的,但是这样做真的很麻烦,这里我研究了半天终于找到一种用既给的函数达到遍历INI的目的。

直接上代码:

void GetWholeINI()
{
CString g_UnitName[100]; //全局变量:探头名称
CString g_UnitID[100]; //全局变量:探头编号
CStringArray g_Section;//全局变量;分割好的section
int counts=0;
int g_UnitNumber=0; //全局变量:探头总数
char strBuffer[48]; //临时缓冲区,用于接收字符串
int saveHead=0;
//获取第一个节点名
DWORD nChar;
GetSections(g_Section);
for(int i=0;i<g_Section.GetSize();i++)
{
while(1)
{
//保存探头标识
nChar = GetPrivateProfileString(g_Section.GetAt(i),NULL,"",strBuffer,sizeof(strBuffer),iniClientFullPath);
g_UnitID[g_UnitNumber] = strBuffer;
//保存探头名称
nChar = GetPrivateProfileString(g_Section.GetAt(i),g_UnitID[g_UnitNumber],"",strBuffer,sizeof(strBuffer),iniClientFullPath);
g_UnitName[g_UnitNumber] = strBuffer;
if(counts==0)
{
m_hostList.InsertItem(i,g_UnitName[g_UnitNumber]);
}
else
{
m_hostList.SetItemText(i,counts,g_UnitName[g_UnitNumber]);
}
if(nChar==0)
{
break;
}
//将此探头从配置文件中删除
WritePrivateProfileString(g_Section.GetAt(i),g_UnitID[g_UnitNumber],NULL,iniClientFullPath);
//保存探头个数
//读不到信息,表示已经遍历整个INI文件,则退出循环
g_UnitNumber ++;
counts++;
}

//将探头信息重新写入配置文件

for(int j = saveHead; j < g_UnitNumber; j++)
{
WritePrivateProfileString(g_Section.GetAt(i),g_UnitID[j],g_UnitName[j],iniClientFullPath);
}
saveHead=g_UnitNumber;
counts=0;
}
}
//分割section
int GetSections(CStringArray &arrSection)
{
int iLength=0;
int iPos=0;
TCHAR chSectionNames[2048]={0}; //总的提出来的字符串
TCHAR chSection[12]={0}; //存放一个段名。
DWORD nChar=GetPrivateProfileSectionNames(chSectionNames,sizeof(chSectionNames),iniClientFullPath);

//以下循环,截断到两个连续的0
for(int i=0;i<nChar;i++)
{
if(chSectionNames[i]==0)
{
arrSection.Add(chSection);
if (chSectionNames[i]==chSectionNames[i+1])
{
break;
}
memset(chSection,0,iLength);
iPos=0;
iLength=0;
}
else
{
chSection[iPos++]=chSectionNames[i];
iLength++;
}
}
return (int)arrSection.GetSize();
}
缓冲区的大小可以根据自己项目中的实际情况来定。
希望能够帮到大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息