删除配置文件中某一行
WritePrivateProfileString(段名, 键名, NULL, 文件路径);
如:
[水果]
苹果 = 1
香蕉 = 2
橘子 = 3
<pre name="code" class="cpp">WritePrivateProfileString(_T("水果"),_T("橘子"), NULL, 文件路径);
结果就是橘子这一行被删除。
在文件操作中经常用到的几个函数:
CString::Find
在一个较大的字符串中查找字符或子字符串 ,返回此CString对象中匹配到的第一个字符从0开始的索引;如果没有找到子字符串或字符则返回-1。
如:
CString str = abcdef;
int n = str.Find('d');
//结果n = 3;
CString::Left(intnCount)
——返回字符串前nCount个字符的字符串
CString::Right(int nCount)
——返回字符串后nCount个字符的字符串
CString a,b;
a = "123456789";
b = a.Left(4); //值为:1234
b = a.Mid(3); //值为:456789
b = a.Mid(2, 4); //值为:3456
b = a.Right(4); //值为:6789
//读取配置文件全部段名方法1
/*统计共有多少个节 节名的分离方法:若chSectionNames数组的第一字符是'\0'字符,
则表明 有0个节。否则,从chSectionNames数组的第一个字符开始,顺序往后找,
直到找到一个'\0'字符,若该字符的后继字符不是 '\0'字符,则表明前面的字符组成一个节名。
若连续找到两个'\0'字符,则统计结束*/
int CTestDlg::CalcCount(void)
{
TCHAR chSectionNames[2048] = { 0 }; //所有节名组成的字符数组
char * pSectionName; //保存找到的某个节名字符串的首地址
int i; //i指向数组chSectionNames的某个位置,从0开始,顺序后移
int j = 0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量
int count = 0; //统计节的个数
::GetPrivateProfileSectionNames(chSectionNames, 2048, ".\\ex1.ini");
for (i = 0; i<2048; i++, j++)
{
if (chSectionNames[0] == '\0')
break; //如果第一个字符就是0,则说明ini中一个节也没有
if (chSectionNames[i] == '\0')
{
pSectionName = &chSectionNames[i - j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量,就是一个节名的首地址
j = -1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名的一部分
AfxMessageBox(pSectionName); //把找到的显示出来
if (chSectionNames[i + 1] == 0)
{
break; //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止
}
}
}
return count;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//读取配置文件全部段名方法2
int CIni::GetSections(CStringArray& arrSection)
{
/*
本函数基础:
GetPrivateProfileSectionNames - 从 ini 文件中获得 Section 的名称
如果 ini 中有两个 Section: [sec1] 和 [sec2],则返回的是 'sec1',0,'sec2',0,0 ,当你不知道
ini 中有哪些 section 的时候可以用这个 api 来获取名称
*/
int i;
int iPos=0;
int iMaxCount;
TCHAR chSectionNames[MAX_ALLSECTIONS]={0}; //总的提出来的字符串
TCHAR chSection[MAX_SECTION]={0}; //存放一个段名。
GetPrivateProfileSectionNames(chSectionNames,MAX_ALLSECTIONS,m_strFileName);
//以下循环,截断到两个连续的0
for(i=0;i<MAX_ALLSECTIONS;i++)
{
if (chSectionNames[i]==0)
if (chSectionNames[i]==chSectionNames[i+1])
break;
}
iMaxCount=i+1; //要多一个0号元素。即找出全部字符串的结束部分。
//arrSection.RemoveAll();//清空原数组
for(i=0;i<iMaxCount;i++)
{
chSection[iPos++]=chSectionNames[i];
if(chSectionNames[i]==0)
{
arrSection.Add(chSection);
memset(chSection,0,i);
iPos=0;
}
}
return (int)arrSection.GetSize();
}