CIniFile类,读取INI文件

本文介绍了一个用于操作INI文件的CIniFile类,该类支持读取和修改INI文件中的整数和字符串变量,能够创建新的组和变量。文章详细解释了如何使用这个类来管理和更新INI文件的内容。

2008年04月26日 星期六 上午 10:27/*==================================================================
= 文件名:CIniFile类定义文件                                       =
= 主要功能:可以读取.修改变量数值,可以设置新的组,新的变量          =
= 修改日期:2002-12-28                                             =
= 作者:阿皮                                                       =
= E_Mail:peijikui@sd365.com QQ:122281932                         =                            =
====================================================================*/
#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

 

/*==================================================================
= 文件名:CIniFile类实现文件                                       =
= 修改日期:2002-12-28                                             =
= 作者:阿皮                                                       =
=   E_Mail:peijikui@sd365.com msn:peijikui@sina.com                                                              =
====================================================================*/
#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;
}
 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值