读写ini文件的类(转)

来源:互联网 发布:淘宝知己知彼多少钱 编辑:程序博客网 时间:2024/06/06 03:44
Inifile.h
 
  1. /*****************************************************************
  2.     文件名:读取当前目录下CIniFile类文件
  3.     日期:2004-1-18
  4.     作者:chao_jie
  5.     E_Mail:chaojie2003@yahoo.com.cn
  6.     功能:系统提供的WriteProfileInt()等函数,写到注册表或
  7.          系统ini文件里,调用比较麻烦,而且会占用注册表资
  8.          源,下载了网上的ini类用起来又不太顺手,所以参照
  9.          写了一个读取当前目录下ini文件的类。程序有详细的
  10.          注释,欢迎批评指正。
  11. *****************************************************************/
  12. /*//////////////////////////////////////////////////////////////////
  13. 使用方法:
  14. 1.先把IniFile.h,IniFile.ccp加入Porject,在要使用该类的头文件中加入
  15.     #include "IniFile.h",及CIniFile IniFile;
  16. 2.读取和写入:
  17.     string = IniFile.GetString("section","item","默认");
  18.     int = IniFile.GetInt("section","item",666);
  19.     IniFile.SetString("section","item","设置值");
  20.     IniFile.SetInt("section","item",666);
  21. 3.ini文件名及路径在初始化时,用SetFileName()设置
  22. 注意事项:ini文件如果太长,读取速度会变慢,可以使用多个ini文件
  23. //////////////////////////////////////////////////////////////////*/
  24. // IniFile.h: interface for the CIniFile class.
  25. //
  26. //////////////////////////////////////////////////////////////////////
  27. #if !defined(AFX_INIFILE_H__33CAF5C6_7820_43EB_8D84_42CC1856C35C__INCLUDED_)
  28. #define AFX_INIFILE_H__33CAF5C6_7820_43EB_8D84_42CC1856C35C__INCLUDED_
  29. #if _MSC_VER > 1000
  30. #pragma once
  31. #endif // _MSC_VER > 1000
  32. class CIniFile  
  33. {
  34. public:
  35.     void SetFileName(CString FileName);
  36.     void WriteFileString(CString Section, CString Item, CString Value);
  37.     CString GetFileString(CString Section, CString Item, CString Value);
  38.     CString GetString(CString Section, CString Item, CString Value);
  39.     int GetInt(CString Section, CString Item, int Value);
  40.     void SetString(CString Section, CString Item, CString Value);
  41.     void SetInt(CString Section, CString Item, int Value);
  42.     BOOL WriteIniFile();
  43.     BOOL ReadIniFile();
  44.     CIniFile();
  45.     virtual ~CIniFile();
  46.     //ini file
  47.     CString m_sFileName;
  48.     CStdioFile IniFile;
  49.     BOOL  bFileExist;
  50.     CStringArray FileContainer;
  51. };
  52. #endif // !defined(AFX_INIFILE_H__33CAF5C6_7820_43EB_8D84_42CC1856C35C__INCLUDED_)

inifile.cpp

 

  1. // IniFile.cpp: implementation of the CIniFile class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "IniFile.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. CIniFile::CIniFile()
  15. {
  16.     m_sFileName = "ini.ini";
  17. }
  18. CIniFile::~CIniFile()
  19. {
  20.     if(FileContainer.GetSize() > 0)
  21.     {
  22.         FileContainer.RemoveAll();
  23.     }
  24. }
  25. void CIniFile::SetFileName(CString FileName)
  26. {
  27.     m_sFileName = FileName;
  28. }
  29. void CIniFile::SetInt(CString Section, CString Item, int Value)
  30. {
  31.     CString strtemp;
  32. //  strtemp.Format("%d",Value);
  33.     //保存到FileContainer
  34.     WriteFileString(Section, Item, strtemp);
  35.     //保存到ini文件
  36.     WriteIniFile();
  37. }
  38. void CIniFile::SetString(CString Section, CString Item, CString Value)
  39. {
  40.     //保存到FileContainer
  41.     WriteFileString(Section, Item, Value);
  42.     //保存到ini文件
  43.     WriteIniFile();
  44. }
  45. CString CIniFile::GetString(CString Section, CString Item, CString Value)
  46. {
  47.     return GetFileString(Section, Item, Value);
  48. }
  49. int CIniFile::GetInt(CString Section, CString Item, CString Value)
  50. {
  51.     CString strtemp;
  52. //  strtemp.Format("%d",Value);
  53. //  return atoi(GetFileString(Section, Item, strtemp));
  54.     return GetFileString(Section, Item, strtemp);
  55. }
  56. BOOL CIniFile::ReadIniFile()
  57. {
  58.     bFileExist=IniFile.Open(m_sFileName, CFile::modeRead);
  59.     if(!bFileExist)
  60.     {
  61.         return FALSE;
  62.     }
  63.     CString strline;
  64.     FileContainer.RemoveAll();
  65.     //将IniFile文件数据读到FileContainer
  66.     while(IniFile.ReadString(strline))
  67.     {
  68.         FileContainer.Add(strline);
  69.     }
  70.     IniFile.Close();
  71.     return TRUE;
  72. }
  73. BOOL CIniFile::WriteIniFile()
  74. {
  75.     bFileExist=IniFile.Open(m_sFileName, CFile::modeCreate | CFile::modeWrite);
  76.     if(!bFileExist)
  77.         return FALSE;
  78.     
  79.     CString strline;
  80.     //将FileContainer写到IniFile文件
  81.     for(int i = 0; i< FileContainer.GetSize(); i++)
  82.     {
  83.         strline = FileContainer[i];
  84.         IniFile.WriteString(strline+"/n");
  85.     }
  86.     IniFile.Close();
  87.     return bFileExist;
  88. }
  89. CString CIniFile::GetFileString(CString Section, CString Item, CString Value)
  90. {
  91.     ReadIniFile();//打开文件
  92.     if(bFileExist == FALSE || FileContainer.GetSize() < 0)
  93.         return Value;//文件打开出错或文件为空,返回默认值
  94.     int i = 0;
  95.     int iFileLines = FileContainer.GetSize();
  96.     CString strline,str;
  97.     while(i<iFileLines)
  98.     {
  99.         strline = FileContainer.GetAt(i++);
  100.         strline.TrimLeft();
  101.         if(strline.GetAt(0)=='[')//查找Section,第一个必须为[
  102.         {
  103.             str=strline.Left(strline.Find("]"));//去掉]右边
  104.             str=str.Right(str.GetLength()-str.Find("[")-1);//去掉[左边
  105.             str.TrimLeft();
  106.             str.TrimRight();
  107.             if(Section == str)//找到Section
  108.             {
  109.                 while(i<iFileLines)
  110.                 {
  111.                     strline = FileContainer.GetAt(i++);
  112.                     strline.TrimLeft();
  113.                     if(strline.GetAt(0)=='[')
  114.                         return Value;//如果到达下一个[],即找不到,返回默认值
  115.                     
  116.                     str = strline.Left(strline.Find("="));//去掉=右边
  117.                     str.TrimLeft();
  118.                     str.TrimRight();
  119.                     if(Item == str)//找到Item
  120.                     {
  121.                         str=strline.Right(strline.GetLength()-strline.Find("=")-1);//去掉=左边
  122.                         str.TrimLeft();
  123.                         str.TrimRight();
  124.                         return str;
  125.                     }
  126.                 }
  127.                 return Value;//找不到,返回默认值
  128.             }
  129.         }
  130.     }
  131.     return Value;//找不到,返回默认值
  132. }
  133. void CIniFile::WriteFileString(CString Section, CString Item, CString Value)
  134. {
  135.     int i = 0;
  136.     int iFileLines = FileContainer.GetSize();
  137.     CString strline,str;
  138.     while(i<iFileLines)
  139.     {
  140.         strline = FileContainer.GetAt(i++);
  141.         strline.TrimLeft();
  142.         if(strline.GetAt(0)=='[')//查找Section,第一个必须为[
  143.         {
  144.             str=strline.Left(strline.Find("]"));//去掉]右边
  145.             str=str.Right(str.GetLength()-str.Find("[")-1);//去掉[左边
  146.             str.TrimLeft();
  147.             str.TrimRight();
  148.             if(Section == str)//找到Section
  149.             {
  150.                 while(i<iFileLines)
  151.                 {
  152.                     strline = FileContainer.GetAt(i++);
  153.                     strline.TrimLeft();
  154.                     if(strline.GetAt(0)=='[')//如果到达下一个[],即找不到Item
  155.                     {
  156.                         break;
  157.                     }
  158.                     
  159.                     str = strline.Left(strline.Find("="));//去掉=右边
  160.                     str.TrimLeft();
  161.                     str.TrimRight();
  162.                     if(Item == str)//找到Item
  163.                     {
  164.                         strline = Item + "=" + Value;
  165.                         FileContainer[i-1] = strline;
  166.                         return;
  167.                     }
  168.                 }
  169.                 //找不到Item
  170.                 strline = Item + "=" + Value;
  171.                 FileContainer.InsertAt(i-1, strline);
  172.                 return;
  173.             }
  174.         }
  175.     }
  176.     //找不到Section
  177.     //直接在最后加入Section,Item,Value
  178.     FileContainer.Add("[" + Section + "]");
  179.     FileContainer.Add(Item + "=" + Value);
  180.     return;
  181. }
原创粉丝点击