• ini文件操作类


    前言:

        相信很多朋友在编写自己的程序中,都需要把一些数据先期导入到程序中进行初始化。那么这个时候,比较好的做法就是把你所有的数据写入一个ini文件,然后在程序去读ini文件中的数据对行初始化。

     

    一.INI简介
           那么什么是ini文件呢?ini文件是Initialization file的缩写,意即初始化文件。(从名字就可以看出它的功能了吧)。不仅你自己的程序可以使用ini文件,其实windows操作系统也有自己的ini文件---win.ini,保存在%WinDir%\system32目录下。Windows通过该文件对当前操作系统进行配置。

        ini文件里的数据的存取是采取的是预先约定好的 “项-值”存储结构,各种数据被分门别类的存储。以下是win.ini 文件的部分内容。

    [Mail]

    MAPI=1

    CMC=1

    CMCDLLNAME=mapi.dll

    CMCDLLNAME32=mapi32.dll

    MAPIX=1

    MAPIXVER=1.0.0.1

    OLEMessaging=1
     
                        表1

    通过以上内容,我们可以看到,ini文件将各种数据分成很多以“[ ]”组成的节,而在每一个“节”中又包含了很多“项”,“项”后面紧跟着一个等号,等号后面则是该项的值。在该例中[Mail]就是一个“节”,MAPI是一个项,1则是MAPI的值。
        所以,它的通用形式我们可以总结成:

    [Section]

    Key=KeyValue

     

    二.操作ini文件的API
    windows SDK提供有两组API对ini文件进行读写。


     写
     
    GetPrivateProfileString

    GetPrivateProfileInt
     WritePrivateProfileString
     
    GetPrivateProfileSection
     WritePrivateProfileSection
     
    GetPrivateProfileSectionNames
      
     
    GetPrivateProfileStruct
     WritePrivateProfileStruct
     


                                                                                 表2

     


     写
     
    GetProfileString

    GetProfileInt
     WriteProfileString
     
    GetProfileSection
     WritePrivateProfileSection
     


                                                                                 表3

        对用户的配置文件来说,一般我们使用的是表2中的函数,这一点从函数中的“private”就可以看出它是针对私有的配置文件的函数(又是废话!)。而表3中的函数则是提供给针对系统配置文件,即win.ini进行操作的函数。现只准备介绍表2中的函数,这也是使用率最高的,表3中的函数操作和表2中的函数操作类同,故略。

           
        现在我们来看看这几个函数的功能:

    DWORD GetPrivateProfileString(

      LPCTSTR lpAppName,           //节名,即Section

      LPCTSTR lpKeyName,           //项名,即Key

      LPCTSTR lpDefault,                //缺省返回字符串。如lpKeyName未找到,拷贝lpDefault到lpReturnedString

      LPTSTR lpReturnedString,       //返回字符串的缓冲地址

      DWORD nSize,                       //缓冲大小

      LPCTSTR lpFileName             //ini文件路径

    );

    功能:根据指定的Section和 Key得到KeyValue,存放在lpReturnedString中

    返回:返回拷贝到缓冲中的字符个数。不包括结束符

     

    UINT GetPrivateProfileInt(

      LPCTSTR lpAppName,           //节名,即Section
      LPCTSTR lpKeyName,           //项名,即Key

      INT nDefault,                           //缺省返回整型值。如lpKeyName未找到,函数返回nDefault的值

      LPCTSTR lpFileName             //ini文件路径

    );

    功能:根据指定的Section和 Key得到整型KeyValue

    返回:返回得到的整型KeyValue

     

    BOOL WritePrivateProfileString(

      LPCTSTR lpAppName,           //节名,即Section
      LPCTSTR lpKeyName,           //项名,即Key

      LPCTSTR lpString,                  //要写入的字符串

      LPCTSTR lpFileName             //ini文件路径
    );

    功能:向指定的Section和 Key写入KeyValue。
          如果lpString为NULL,则删除当前lpKeyName

        如果lpKeyName=lpString=NULL,则删除当前Section以及其下的所有Key

           如果Section或者Key不存在,则创建;存在则覆盖

    返回:写入成功。

     

    DWORD GetPrivateProfileSectionNames(

      LPTSTR lpszReturnBuffer,             //存放所有Section的缓冲地址

      DWORD nSize,                             //缓冲大小

      LPCTSTR lpFileName                   //ini文件路径

    );

    功能:得到ini文件中所有Section名。

    返回:返回拷贝到缓冲中的字符个数。不包括结束符。
    注意:返回的所有Section在缓冲中的存放格式为“Section1”,0,“Section2”,0。。。。

          若需要得到具体的每个Section,则需要进行字符串解析。在后面的IniFile类中的GetAllKeysAndValues函数中会看到解
          析步骤。






    DWORD GetPrivateProfileSection(

      LPCTSTR lpAppName,                   //节名,即Section    

      LPTSTR lpReturnedString,              //存放指定Section下所有的Key和KeyValue的缓冲地址

      DWORD nSize,                              //缓冲大小

      LPCTSTR lpFileName                     //ini文件路径

    );

    功能:得到指定Section下所有的Key和KeyValue。

    返回:返回拷贝到缓冲中的字符个数。不包括结束符。

    注意:返回的“项-值对”在缓冲中的存放格式为“Key1=KeyValue1”,0,“Key2=KeyValue2”,0 。。。。

    若需要得到具体的Key和KeyValue,则需要进行字符串解析。在后面的IniFile类中的GetAllKeysAndValues函数中会看到解析步骤。

    GetPrivateProfileStruct和WritePrivateProfileStruct用的较少,本文也未介绍,感兴趣的朋友可以自己看看MSDN,里面也有详细介绍。

     



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



    //保存到配置文件中(.ini)
        char   exeFullPath[MAX_PATH];   
        GetModuleFileName(NULL,exeFullPath,MAX_PATH);
    //获得该程序的路径
        CString temp = exeFullPath;
        temp 
    = temp.Left(temp.ReverseFind('\\'));
        temp 
    = temp+FILE_PARAMETER;

        CString S,L,U,R,B,T;

        GetDlgItemText(IDC_STATIC_SET_WORK_PULSE_S,S);
        GetDlgItemText(IDC_STATIC_SET_WORK_PULSE_L,L);
        GetDlgItemText(IDC_STATIC_SET_WORK_PULSE_U,U);
        GetDlgItemText(IDC_STATIC_SET_WORK_PULSE_R,R);
        GetDlgItemText(IDC_STATIC_SET_WORK_PULSE_B,B);
        GetDlgItemText(IDC_STATIC_SET_WORK_PULSE_T,T);

        
        WritePrivateProfileString(
    "HomePosition","SAxisPulse",S,temp);   //把数据保存在相应节名下的 项名中
        WritePrivateProfileString("HomePosition","LAxisPulse",L,temp);
        WritePrivateProfileString(
    "HomePosition","UAxisPulse",U,temp);
        WritePrivateProfileString(
    "HomePosition","RAxisPulse",R,temp);
        WritePrivateProfileString(
    "HomePosition","BAxisPulse",B,temp);
        WritePrivateProfileString(
    "HomePosition","TAxisPulse",T,temp);



     
    ///从配置文件读取较准原点坐标数据
          char exeFullPath[MAX_PATH];
          GetModuleFileName(NULL,exeFullPath,MAX_PATH);
          CString str
    =exeFullPath;
          CString temp
    =str.Left(str.ReverseFind('\\'));
          
    char AllSections[100];
          GetPrivateProfileSectionNames(AllSections,
    100,temp);  //得到所有节名
          int imaxcount=0;
          
    for(i=0;i<100;i++)
          
    {
             
    if(AllSections[i]==0 && AllSections[i]==AllSections[i+1])  //节名最后是2个0   ,依此判断有效节名的数
                 break;          
          }

         imaxcount
    =i+1;  //
         int pos=0;int NumSections=0;
         
    char section[100]={0};
         CString SectionName[
    20];
         
    for(i=0;i<imaxcount;i++)
         
    {
             section[pos
    ++]=AllSections[i];
             
    if(AllSections[i]==0)
             
    {
                 SectionName[NumSections
    ++]=section;  //把所有的节名分别保存在SectionName中
                         pos=0;
                 memset(section,
    0,sizeof(section));

             }

        
         }

        
    bool BhasHome=false,BhasLimitPosition=false
       
    for(i=0;i<NumSections;i++)
       
    {
           
    if(SectionName[i]=="HomePosition")        //判断有没有"HomePosition"节名
               BhasHome=true;
           
    else if(SectionName[i]="LimitPosition")    //判断有没有"LimitPosition"节名
               BhasLimitPosition=true;

       }

       
    if(!BhasHome)
       
    {
           AfxMessageBox(
    "没有设定原点,请设定原点!");
           
    return;
       }

       
    if(BhasLimitPosition)
       
    {
           AfxMessageBox(
    "没有设定软限位,请设定软限位!");
           
    return;

       }


          
    char SPulse[20],LPulse[20],UPulse[20],RPulse[20],BPulse[20],TPulse[20];   //获取相应节名下,相应项名数据
          GetPrivateProfileString("HomePosition","SAxisPulse",0,SPulse,20,temp);
          GetPrivateProfileString(
    "HomePosition","LAxisPulse",0,LPulse,20,temp);
          GetPrivateProfileString(
    "HomePosition","UAxisPulse",0,UPulse,20,temp);
          GetPrivateProfileString(
    "HomePosition","RAxisPulse",0,RPulse,20,temp);
          GetPrivateProfileString(
    "HomePosition","BAxisPulse",0,BPulse,20,temp);
          GetPrivateProfileString(
    "HomePosition","TAxisPulse",0,TPulse,20,temp);
             absPulse[
    0]=atol(SPulse);
          absPulse[
    1]=atol(LPulse);
          absPulse[
    2]=atol(UPulse);
          absPulse[
    3]=atol(RPulse);
          absPulse[
    4]=atol(BPulse);
          absPulse[
    5]=atol(TPulse);
        
        
          
    //以下是软限位设置
          char SoftLimitPS[20],SoftLimitNS[20],SoftLimitPL[20],SoftLimitNL[20],SoftLimitPU[20],SoftLimitNU[20];
              
    char SoftLimitPR[20],SoftLimitNR[20],SoftLimitPB[20],SoftLimitNB[20],SoftLimitPT[20],SoftLimitNT[20];
          GetPrivateProfileString(
    "LimitPosition","S+",0,SoftLimitPS,20,temp);
          GetPrivateProfileString(
    "LimitPosition","S-",0,SoftLimitNS,20,temp);
          GetPrivateProfileString(
    "LimitPosition","L+",0,SoftLimitPL,20,temp);
          GetPrivateProfileString(
    "LimitPosition","L-",0,SoftLimitNL,20,temp);
          GetPrivateProfileString(
    "LimitPosition","U+",0,SoftLimitPU,20,temp);
          GetPrivateProfileString(
    "LimitPosition","U-",0,SoftLimitNU,20,temp);
          GetPrivateProfileString(
    "LimitPosition","R+",0,SoftLimitPR,20,temp);
          GetPrivateProfileString(
    "LimitPosition","R-",0,SoftLimitNR,20,temp);
          GetPrivateProfileString(
    "LimitPosition","B+",0,SoftLimitPB,20,temp);
          GetPrivateProfileString(
    "LimitPosition","B-",0,SoftLimitNB,20,temp);
          GetPrivateProfileString(
    "LimitPosition","T+",0,SoftLimitPT,20,temp);
          GetPrivateProfileString(
    "LimitPosition","T-",0,SoftLimitNT,20,temp);
          
    long SoftLimit[12];
          SoftLimit[
    0]=atol(SoftLimitNS);
          SoftLimit[
    1]=atol(SoftLimitPS);
          SoftLimit[
    2]=atol(SoftLimitNL);
          SoftLimit[
    3]=atol(SoftLimitPL);
          SoftLimit[
    4]=atol(SoftLimitNU);
          SoftLimit[
    5]=atol(SoftLimitPU);
          SoftLimit[
    6]=atol(SoftLimitNR);
          SoftLimit[
    7]=atol(SoftLimitPR);
          SoftLimit[
    8]=atol(SoftLimitNB);
          SoftLimit[
    9]=atol(SoftLimitPB);
          SoftLimit[
    10]=atol(SoftLimitNT);
          SoftLimit[
    11]=atol(SoftLimitPT);

  • 相关阅读:
    最短路打印路径
    hdu1874(dijskstra算法和floyd算法)
    最短路径(Dijkstra算法)
    kruskal算法模板(续)
    kruskal算法模板
    最小生成树prim算法
    hdu1879(并查集)
    hdu1875 并查集
    top 1 1
    mvc 母版页中登录注册和问候的处理
  • 原文地址:https://www.cnblogs.com/wqj1212/p/1097408.html
Copyright © 2020-2023  润新知