Visual Studio 2010读写ini文件(1)读出ini文件所有键名、节名、键值

来源:互联网 发布:linux可以用网银吗 编辑:程序博客网 时间:2024/06/03 17:25

需求描述:用visual studio开发的客户端程序,需要将程序的配置保存到ini文件中。每次打开程序都会读入ini文件,根据里面的记录来恢复客户端的配置;客户端的配置修改之后,需要将修改保存写入ini文件中。


ini文件(即Initialization file):这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。(如下图所示)




读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。

(1)ini文件读取所有节名、键名、键值:

1.读取ini文件中的节名、键名、键值调用的函数:

获取所有节名函数:GetPrivateProfileSectionNames(returnBuff, MAX_PATH, m_szPath);//获取节名  

获取所有键名键值函数:GetPrivateProfileSection(pTemp, returnKey, MAX_PATH, m_szPath);//获取键名键值   

(其中m_szPath为ini文件的路径,MAX_PATH为读取的字节数,得到的结果保存在字符型数组变量 returnBuff、pTemp、returnKey中)

2.代码实现读出ini文件中节数和所有节名:

上面函数中得到的保存所有键名、节名的字符数组变量returnBuff,键名节名之间用 ‘\0’隔开,当遇到以‘\0’开头的元素时说明,已经读完最后一个键名/节名。利用这个特性可以写如下代码得到ini文件中的所有节名和总共的节数:

/*统计共有多少个节节名的分离方法:若returnBuff数组的第一字符是'\0'字符,则表明有0个节。否则,从returnBuff数组的第一个字符开始,顺序往后找,直到找到一个'\0'字符,若该字符的后继字符不是 '\0'字符,则表明前面的字符组成一个节名。若连续找到两个'\0'字符,则统计结束*/

TCHAR returnBuff[2048];   int i;       //i指向数组pTemp的某个位置,从0开始,顺序后移int j=0;      //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量int count=0;      //统计节的个数char * pSectionName; //保存找到的某个节名字符串的首地址  LPTSTR pTemp;  LPTSTR pKeyTemp;    GetPrivateProfileSectionNames(returnBuff, 2048, ".\\SetAllListDate.ini");//获取节名,其中".\\SetAllListDate.ini"是ini文件的路径    pTemp = returnBuff; for(i=0;i<2048;i++,j++){     if(pTemp[0]=='\0')       break;       //如果第一个字符就是0,则说明ini中一个节也没有      if(pTemp[i]=='\0')      {       pSectionName=&pTemp[i-j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量,            //就是一个节名的首地址       j=-1;         //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量            //赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名            //的一部分        //在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。        AfxMessageBox(pSectionName);      //pSectionName是找到的节名,把找到的显示出来       if(pTemp[i+1]==0)       {         break;      //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止       }      }   }  


3. 代码实现读出一个节中所有的键名和键值(以“key=value“字符串的形式返回):

void readKeysAndValues(){TCHAR szBuf[1024]; memset(szBuf,0,1024);INT nNum=0;INT nLen= 0;nNum=::GetPrivateProfileSection(_T("ListName"),szBuf,1024,".\\SetAllListDate.ini");char * szWork; //保存找到的某个节名字符串的首地址while(nLen<=1024){szWork=&szBuf[nLen];//此处的szWork为所需内容nLen=nLen+1;if(szBuf[nLen]==0)  //当指针指向0时说明已经读到末尾break;nLen+=_tcslen(szWork);}}

再进一步,代码实现取出所有的键值:

void readKeyValues(){TCHAR szBuf[1024]; memset(szBuf,0,1024);INT nNum=0;INT nLen= 0;nNum=::GetPrivateProfileSection(_T("ListName"),szBuf,1024,".\\SetAllListDate.ini");char * szWork; //保存找到的某个节名字符串的首地址char *keyValue;while(nLen<=1024){szWork=&szBuf[nLen];//此处的szWork为所需内容nLen=nLen+1;if(szBuf[nLen]==0)break;nLen+=_tcslen(szWork);int index=0;for(index;index<_tcslen(szWork);index++){if(szBuf[index]=='='){keyValue=&szWork[index+1];//单独取出健值break;}}}}




原创粉丝点击