使WINCE支持INI配置文件

来源:互联网 发布:matlab用什么语言编程 编辑:程序博客网 时间:2024/05/14 23:47
使WINCE支持INI配置文件
    在我们编写的应用软件中,某些情况下不可避免的会使用一些配置文件来提高我们的应用程序的灵活性。Wince中不支持INI文件的读取。
     我封装了一个类来读取INI文件,其中主要实现了一下几个功能:
//读取值
BOOL GetValueString(const PCHAR pSection, const PCHAR pKey, PCHAR pReturnValue);
BOOL GetValueInteger(const PCHAR pSection, const PCHAR pKey, PDWORD pdwReturnValue);
//写入值
BOOL SetValueString(const PCHAR pSection, const PCHAR pKey, const PCHAR pSetValue, BOOL bNeedCreate);
BOOL SetValueInteger(const PCHAR pSection, const PCHAR pKey, PDWORD pdwSetValue, BOOL bNeedCreate);
目前还没有实现SET功能,但是一般的配置文件的读取已经实现,我是一个新程序员,使用的方法也比较笨。
下面是我的大概思路:首先,我们不知道一个INI配置文件到底有多大,对于嵌入式系统,内存空间是有限的,虽然现在基本都是64M以上了,但是我们也不能过多的使用内存,应当合理利用。打开文件之后,读取其中的内容到内存中,每次只读取一个块。
读取的块由get功能里面的pSection决定,首先查找文件中的字符,将相应的块读取到内存中,然后再由pKey来查找需要的值。
代码如下:查找块名是读取一行之后比较
1.       读取每一行
BOOL CIniFileOP::ReadOneLine(PCHAR OutBuffer)
{
DWORD total, i = 0, j = 1, FilePointer=0;
CHAR temp[MAXINLINE] = {0};
 
while (1)
{
           i = 0;
           while(1)
           {
                    ReadFile(m_fileHandle, &temp[i], 1, &total, NULL);
                    if (0 == total)
                    {
                             RETAILMSG(DBGMSGON, (_T("End-of-file\r\n")));
                             return FALSE;
                    }
                    FilePointer++;
                    lFilePointer = FilePointer;
 
                    if (0x0d == temp[i])  // \n,enter
                    {
                             temp[i] = '\0';
                    }
 
                    if (0x0a == temp[i])  // \r,newline
                    {
                             break;
                    }
                    i++;
           }
           temp[i] = '\0';
 
#if DBGMSGON
TCHAR wTemp[MAXINLINE];
mbstowcs(wTemp, temp, sizeof(temp));
RETAILMSG(DBGMSGON, (_T("::%d::\t"), j));
RETAILMSG(DBGMSGON, (wTemp));
RETAILMSG(DBGMSGON, (_T("\r\n")));
#endif
           if (DeleteSpaceL(temp))
           {
                    if (';' != temp[0] || '#' != temp[0])
                    {
                             DeleteNote(temp);
                             DeleteSpaceR(temp);
                             memcpy(OutBuffer, temp, sizeof(temp));
                             return TRUE;
                    }
           }
 
           j++;
}
return FALSE;
}
2.       在读取完成之后删除前后的空格!这个里面是没有任何比较在里面的,然后我们需要写一个读取一个块的函数。
BOOL CIniFileOP::ReadOneSection(const PCHAR pSection)
{
         CHAR Temp[MAXINLINE] = {0}, Temp2[MAXINLINE] = {0};
         DWORD KeyNum = 0;     
        
         if (INVALID_HANDLE_VALUE == m_fileHandle)
         {
                   IniFileErrorHandle(_T("<<INIFILE>>OPEN FAILED!!\r\n"));
                   return FALSE;
         }
 
         strcpy(SectionNameOpened, pSection);
         memset(OneSection, 0, sizeof(OneSection));
         SetFilePointer (m_fileHandle, 0, NULL, FILE_BEGIN);
         while (ReadOneLine(Temp2))
         {
                   if ('[' == Temp2[0])
                   {
                            for (INT i = 1, j = 0; ']' != Temp2[i]; i++, j++)
                            {
                                     if (' ' != Temp2[i])
                                     {
                                               Temp[j] = Temp2[i];
                                     }
                                     else
                                     {
                                               i++;
                                     }
                            }
                            Temp[j] = '\0';
                   }
                   memset(Temp2, 0, sizeof(Temp2));
 
                   if (strcmp(Temp,pSection)==0)
                   {       
                            memset(Temp, 0, sizeof(Temp));
                            while (ReadOneLine(Temp))
                            {
                                     if ('[' != Temp[0])
                                     {
                                               strcpy(OneSection[KeyNum], Temp);
                                               //OneSection[KeyNum] = Temp;
                                               KeyNum++;
                                     }
                                     else
                                     {
                                               if (0 == KeyNum)
                                               {
                                                        RETAILMSG(DBGMSGON, (_T("This section have no key\r\n")));
                                                        return FALSE;
                                                        break;
                                               }
                                               dwKeyNum_OpenedSection = KeyNum;
                                               return TRUE;
                                               break;
                                     }
                            }
                   }
         }
         RETAILMSG(DBGMSGON, (_T("You want section is not exist!!!\r\n")));
         return FALSE;
}
在这个类里面,读取一个块之后,将这个块的名字记录下来,以便下一次查找,如果下一次查找的KEY值仍然是这个块里面的,哪么我们就无需再读取了
3.
BOOL CIniFileOP::GetValueString(const PCHAR pSection, const PCHAR pKey, PCHAR pReturnValue)
{
  CHAR TempValue[MAXINLINE] = {0}, TempKey[MAXINLINE] = {0};
  INT i = 0;
 
  if (0 != strcmp(pSection, SectionNameOpened))
  {
            ReadOneSection(pSection);
  }
  if (0 == dwKeyNum_OpenedSection)
  {
            RETAILMSG(DBGMSGON,(_T("This section have no key\r\n")));
  }
 
  for (DWORD j = 0; j < dwKeyNum_OpenedSection; j++)
  {
            memset(TempKey, 0, sizeof(TempKey));
            for (INT i = 0; '=' != OneSection[j][i]; i++)
            {
                     TempKey[i] = OneSection[j][i];
            }
           
            if (0 == strcmp(pKey, TempKey))
            {
                     if ('=' == OneSection[j][i])
                     {
                              i++;
                     }
                     for (INT k = 0; '\0' != OneSection[j][i]; k++)
                     {
                              TempValue[k] = OneSection[j][i];
                              i++;
                     }
                     TempValue[k] = '\0';
                     strcpy(pReturnValue, TempValue);
                     RETAILMSG(DBGMSGON, (_T("Find the key\r\n")));
                     return TRUE;
            }
  }
 
  RETAILMSG(DBGMSGON, (_T("Not found you key in this section!!\r\n")));
 
  return FALSE;
}
就这么几个简单的函数就可以实现winceini文件的操作,淡然其中省略了一些我们常用的函数,比如删除前后空格或者是删除前后回车换行等。
3.       GetValueInteger的实现方法就比较简单了,我们用字符型把值读出来,然后再转换呢成整形,这样就可以实现了
其实总体来说,我用的方法比较复杂,而且效率不是很高,我非常愿意和有兴趣的人一起讨论,希望能够改善我的代码!让他尽可能少的出现BUG或者低效率情况!
 
 
 
 
 
 
 
阅读(1930) | 评论(1) | 转发(0) |
0

上一篇:WINCE下三串口驱动程序

下一篇:wince下MP3播放

相关热门文章
  • linux下的鸟哥私房菜第一篇—...
  • libvirt架构及源码分析(一)...
  • 从异地到网资,我最终的选择...
  • 女生想丑很难 无线网卡8500WN...
  • 马云的一句话改变我的一生...
  • 10种启动故障解决方法(转)...
  • 关于自动弹出网页的解决方法...
  • Auto CAD 2007中文版 迅雷免费...
  • 出现“high definition audio...
  • 全国计算机一级考试试题...
  • 如何编写一个C程序实现将字符...
  • C程序能不能在main函数之前调...
  • 看一个程序调用了哪些动态库用...
  • 回复不了你啊,咋,威望值不够...
  • mysql的medium.cnf在哪里?...
给主人留下些什么吧!~~

so9272008-08-04 16:33:31

在实际应用中,我发现了这个程序有许多的BUG修改当中

回复 | 举报
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅族s6屏幕碎了怎么办 格力空调化霜怎么办 一开空调就跳闸怎么办 洗衣机顶盖的安全开关损坏怎么办 苹果平板电脑拍照坏了怎么办 苹果hom键不灵了怎么办 平板电脑home键发烫怎么办 华为平板无法输入资料怎么办 安卓平板没声音怎么办? 平果手机充不了电怎么办 苹果6s用电太快怎么办 平板充不起电了怎么办 日本买的电器国内售后怎么办 海淘地址试投不成功怎么办 怀孕了吐得厉害怎么办 玩网页游戏好卡怎么办 网页游戏占cpu高怎么办 微信有余额绑定其他名下怎么办 银行卡绑定支付余额不对怎么办 可乐机不制冷了怎么办 被淘宝卖家威胁怎么办 征信不好想贷款怎么办 急用钱征信不好怎么办 急用钱逾期不还怎么办 急用钱借款不还怎么办 做b超按压疼痛怎么办 做b超没有尿怎么办 b超憋不到尿怎么办 做b超前没有尿意怎么办 肝胆b超前喝水了怎么办 肝胆彩超喝水了怎么办 胆囊b超喝了水怎么办 系统b超照不到怎么办 思维彩超宝宝不动怎么办 怀孕七个月胎儿缺氧怎么办 怀孕29周小孩偏小怎么办 孕29周胎儿臀位怎么办 刚怀孕有囊肿该怎么办 食杏中毒怎么办吃什么 猫吃了扁桃仁怎么办 夏天来了??点狐臭怎么办?