迷你5207专属论坛

注册

 

发新话题 回复该主题

[魅族M8] M8SDK学习之Ini文件API [复制链接]

发表者
在软件中需要设置一些参数,而这些参数保存可以通过注册表或者写文件的方式,简单的方法就是写INI文件。INI具体有一定的格式规范,可以非常简单的进行操作方法的封装。在m8sdk中也提供了INI的读写API,这一篇将学习如何使用m8sdk的API进行INI的应用。

在m8的例子中没有对INI相关API的说明,在其提供的帮助文档中找到的(Meizu M8 PlatformAPI Documentation (CHS).chm),ReadWriteIni.h这个文件头即是。写了好几篇文章后,不知道大家对.h文件是否有了解?我在最开始的学习中还是遇到了点麻烦,一直使用DELPHI开发都是使用类,而且Delphi中的代码单元都是.pas,而C/C++就不一样。我们在看魅族提供的sdk中也发现了,所有提供的资源都是.h文件,.h文件即是头文件,简单的理解就是申明文件,所有的申明部分都可以放在.h,然后在具体 的.cpp文件中实现即可,所以在代码头都会有#include "XXXX.h"这样的代码,就是引入申明,而且使用头文件有个好处就是申明与实现分开,只要将申明公布即可,实现的细节就可以隐藏起来了,而使用者也不用关心实现部分就可以调用具体的功能了。就好像是个约定——接口。

回到主题INI,要使用sdk的Ini 相关的API,必须将ReadWriteIni.h添加到工程的头文件中,然后在需要使用的代码中#include "ReadWriteIni.h"即可。
在ReadWriteIni.h中对所有的函数都进行了中文说明:
  1. //Ini文件的创建,Ini文件的字符编码采用Unicode little编码,即0xFF, 0xFE开头,和txt一样
  2. bool IniCreateFile(TCHAR *IniFileName);

  3. //判断某个段是否存在,其中, pAppName:段名, pFileName: .ini文件名。 存在返回true,不存在返回false
  4. bool IsExistApp(TCHAR *pAppName, TCHAR *pFileName);

  5. //往ini文件中加入一个字符串的值,其中, pAppName:段名, pKeyName:键名, pString:键值, pFileName: .ini文件名
  6. //当pKeyName == NULL时,会删除整个pAppName段,当pString == NULL时,会删除pAppName段下的pKeyName键.
  7. bool IniWriteString(TCHAR *pAppName, TCHAR *pKeyName, TCHAR *pString, TCHAR *pFileName);

  8. //从ini文件中读取一个字符串值,其中,pAppName:段名, pKeyName:键名, pString:读到的键值, pFileName: .ini文件名
  9. //注音:**pString为指针的指针,在本函数中申请内存,反回给应用程序,应用程序在使用完后,一定要free内存
  10. bool IniReadString(TCHAR *pAppName, TCHAR *pKeyName, TCHAR **pString, TCHAR *pFileName);

  11. //往ini文件中加入一个DWORD类型的值,其中, pAppName:段名, pKeyName:键名, dwValue:键值, pFileName: .ini文件名
  12. bool IniWriteInt(TCHAR *pAppName, TCHAR *pKeyName, DWORD dwValue, TCHAR *pFileName);

  13. //从ini文件中读到一个DWORD类型的值,其中, pAppName:段名, pKeyName:键名, *dwValue:读到的键值, pFileName: .ini文件名
  14. bool IniReadInt(TCHAR *pAppName, TCHAR *pKeyName, DWORD *dwValue, TCHAR *pFileName);
复制代码
我只举个例子来简单的说明下使用方法
  1. //创建Ini文件
  2. IniCreateFile(L"Program Files\\ClockData.ini");
  3. //写
  4. IniWriteString(L"ItemList", L"ItemName", L"M8", L"Program Files\\ClockData.ini");
  5. //读
  6. TCHAR* tmp;
  7. IniReadString(L"ItemList", "ItemName", &tmp, L"Program Files\\ClockData.ini");
复制代码
就这么简单就行了,在使用中要注意一点,我在做实验时遇到这样一个问题,在PC上手工建立了一份INI文件,然后将文件传入到模拟器中,结果死都读不出来,也没找出具体的原因,不知道是否两个系统的文件格式不兼容?但在比较了使用M8SDK写的INI文件内容后,发现在格式上是有些不同,比如:
  1. 这是我手工编辑的INI文件内容
  2. [Header]
  3. IsOpen=1
  4. RunPos=0

  5. 而用M8SDK生成同样内容的INI去在每个键名前都增加了两个空格
  6. [Header]
  7.   IsOpen=1
  8.   RunPos=0
复制代码
具体是M8SDK固有格式呢?还是Wince的格式不是很清楚。而且我尝试过将在PC中手工建的INI内容改成后者的格式还是不能读出,于是就觉得是两个系统存在文件格式差别。后来才反应过来,这是因为在wince中是使用Uniocde编码的,而在windowsxp中建的文件是ansi编码,所以大家要注意啦



作者:5207
出处:http://www.mini188.com
本文版权归作者所有,欢迎转载请注明出处,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
本主题由 皇帝 5207 于 2010-12-27 22:53:31 执行 设置高亮 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
沙发

请问一下,如何判断INI文件是否存在?
TOP
凳子

回复 2# 忧郁沙 的帖子

看看这篇帖子:http://www.mini188.com/showtopic-953.aspx

里面有一个函数:
# //检查文件否存在
# //参数:
# //    TCHAR* filename: 待检查的文件完整路径
# //返回值: 存在返回true, 否则为false;
# bool FileExists(TCHAR* filename)
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
发新话题 回复该主题