天天看點

CIniFile類,讀取INI檔案

2008年04月26日 星期六 上午 10:27

#ifndef _CINIFILE_H_

#define _CINIFILE_H_

//使用者接口說明:在成員函數SetVarStr和SetVarInt函數中,當iType等于零,則如果使用者制定的參數在ini檔案中不存在,

//則就寫入新的變量.當iType不等于零,則如果使用者制定的參數在ini檔案中不存在,就不寫入新的變量,而是直接傳回FALSE;

class CIniFile

{

public:

CIniFile();

virtual ~CIniFile();

private:

CIniFile(const CIniFile &);

CIniFile & operator = (const CIniFile &);

public:

//建立函數

BOOL Create(const CString &strFileName);

//得到變量整數型數值

BOOL GetVarInt(const CString &,const CString & ,int &);

//得到變量字元串型數值

BOOL GetVarStr(const CString &,const CString & ,CString & );

//重新設定變量整數型數值

BOOL SetVarInt(const CString &,const CString & ,const int &,const int iType = 1);

//重新設定變量字元串型數值

BOOL SetVarStr(const CString &,const CString &, const CString &,const int iType = 1);

private:

BOOL GetVar(const CString &,const CString &,CString &);

BOOL SetVar(const CString &,const CString &,const CString &,const int iType = 1);

int SearchLine(const CString &,const CString &);

private:

// vector <CString> FileContainer;

CArray <CString,CString> FileContainer;

BOOL bFileExsit;

CStdioFile stfFile;

CString strInIFileName;

};

#endif

#include "stdafx.h"

#include "CIniFile.h"

CIniFile::CIniFile():bFileExsit(FALSE)

{

}

CIniFile::~CIniFile()

{

if(bFileExsit)

{

   if(stfFile.Open(strInIFileName,CFile::modeCreate | CFile::modeWrite) && FileContainer.GetSize() > 0)

   {

    CString strParam;

    for(int i = 0; i< FileContainer.GetSize();i++)

    {

     strParam = FileContainer[i];

    // stfFile.WriteString(strParam);

     stfFile.WriteString(strParam+"/n");

    }

   }

   stfFile.Close();

}

if(FileContainer.GetSize() > 0)

{

   FileContainer.RemoveAll();

}

}

BOOL CIniFile::Create(const CString & strFileName)

{

bFileExsit = FALSE;

strInIFileName = strFileName;

if(!stfFile.Open(strFileName,CFile::modeRead))

{

   return bFileExsit;

}

CString strFileLine;

while(bFileExsit = stfFile.ReadString(strFileLine))

{

   if(bFileExsit == FALSE)

    return bFileExsit;

   FileContainer.Add(strFileLine);

}

stfFile.Close();

bFileExsit = TRUE;

return bFileExsit;

}

BOOL CIniFile::GetVar(const CString & strSection,const CString & strVarName,CString &strReturnValue)

{

if(bFileExsit == FALSE || FileContainer.GetSize() < 0)

   return bFileExsit;

int iLine = SearchLine(strSection,strVarName);

if(iLine > 0)

{

   CString   strParam = FileContainer[iLine -1];

     strReturnValue = strParam.Mid(strParam.Find("=") + 1);

   return TRUE;

}

return FALSE;

}

BOOL CIniFile::GetVarStr(const CString & strSection,const CString & strVarName,CString &strReturnValue)

{

return(GetVar(strSection,strVarName,strReturnValue));

}

BOOL CIniFile::GetVarInt(const CString & strSection,const CString & strVarName,int & iValue)

{

CString strReturnVar;

if(GetVar(strSection,strVarName,strReturnVar))

{

   strReturnVar.TrimLeft();

   int iLen = strReturnVar.GetLength();

   iValue = atoi(strReturnVar.GetBuffer(iLen));

   return TRUE;

}

return TRUE;

}

BOOL CIniFile::SetVar(const CString & strSection,const CString & strVarName,const CString & strVar,const int iType)

{

if(bFileExsit == FALSE )

   return bFileExsit;

if(FileContainer.GetSize() == 0)

{

   FileContainer.Add("[" + strSection + "]");

   FileContainer.Add(strVarName + "=" + strVar);

   return TRUE;

}

int i = 0;

int iFileLines = FileContainer.GetSize();

//for(pInterator;pInterator != FileContainer.end();++pInterator)

//{

while(i< iFileLines)

{

   CString   strValue = FileContainer.GetAt(i++);

   strValue.TrimLeft();

   if((strValue.Find("[") >=0) && (strValue.Find(strSection) >=0))

   {

    while(i < iFileLines)

    {

     CString strSectionList = FileContainer[i++];

     strSectionList.TrimLeft();

     if(strSectionList.Find("//") >=0)//找到注釋行

      continue;

     if(strSectionList.Find(strVarName)>=0)//找到

     {

      CString strParam = strVarName + "=" + strVar;

      //FileContainer.SetAt(i-1,strParam);

      FileContainer[i-1] = strParam;

      return TRUE;

     }

     if(strSectionList.Find("[",0)>=0)//在原來檔案的SECTION中,沒有相應的變量需要添加而且,這種情況下,下邊還有别的section

     {

      //處理流程是這樣的,首先把目前的數值依次向後移動,然後在目前位置加入新出現的數值

      if(iType !=0)

       return FALSE;

      CString strParam;

      FileContainer.Add(strParam);

      int iPre = FileContainer.GetSize()-1;

      while(iPre >= i)

      {

       CString strBehind = FileContainer[iPre -1];

       FileContainer[iPre] = strBehind;

       iPre --;

      }//*/

      strParam = strVarName + "=" + strVar;

      FileContainer.SetAt(i-1,strParam);

      return TRUE;

     }

     if(i == iFileLines && iType == 0)

     {

      FileContainer.Add(strVarName + "=" + strVar);

      return TRUE;

     }

    }

   }

}

if(iType == 0)

{

   FileContainer.Add("[" + strSection + "]");

   FileContainer.Add(strVarName + "=" + strVar);

}

return TRUE;

}

BOOL CIniFile::SetVarStr(const CString & strSection,const CString & strVarName,const CString & strValue,const int iType)

{

return SetVar(strSection,strVarName,strValue,iType);

}

BOOL CIniFile::SetVarInt(const CString & strSection,const CString & strVarName,const int & iValue,const int iType)

{

CString strVar;

strVar.Format("%d",iValue);

return (SetVar(strSection,strVarName,strVar,iType));

}

int CIniFile::SearchLine(const CString & strSection,const CString & strVarName)

{

if(FileContainer.GetSize() > 0)

{

   int i = 0;

   int iFileLines = FileContainer.GetSize();

   while(i< iFileLines)

   {

    CString strValue = FileContainer[i++];

    strValue.TrimLeft();

    if(strValue.Find("[") >=0 && strValue.Find(strSection,1)>=0)

    {

     while(i < iFileLines)

     {

      CString strSectionList = FileContainer[i++];

      strSectionList.TrimLeft();

      if(strSectionList.Find("//") >=0)//找到注釋行

       continue;

      if(strSectionList.Find(strVarName)>=0)//找到

      {

       return i;

      }

      if(strSectionList.Find("[",0) >= 0)//另外一個段落出現,尋找失敗

      {

       return -2;

      }

     }

    }

   }

}

return -1;

}