C++操作配置文件用到的一些方法

删除配置文件中某一行

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();
}



猜你喜欢

转载自blog.csdn.net/eat_orange/article/details/51732050