文件 *** 作2之plist文件 *** 作

文件 *** 作2之plist文件 *** 作,第1张

概述文件 *** 作2之plist文件 *** 作 DionysosLai(906391500@qq.com) 2015/1/19          Plist文件属于一种比较常见文件格式,通常用来存储用户设置,也可以用于存储捆绑信息,原先是用在Mac中,后来推广到其他系统中。概况来说,Plist文件是以.plist格式结尾,xml格式的一种文件,读写方式比较基本以’键’= ‘值’方式对应。          本文系

文件 *** 作2之pList文件 *** 作

dionysosLai(906391500@qq.com) 2015/1/19

PList文件属于一种比较常见文件格式,通常用来存储用户设置,也可以用于存储捆绑信息,原先是用在Mac中,后来推广到其他系统中。概况来说,PList文件是以.pList格式结尾,xml格式的一种文件,读写方式比较基本以’键’= ‘值’方式对应。

本文系统的介绍基于cocos2dx-2.3版本的pList文件读写细节,希望通过本文,对其他pList文件能够达到自由读取目的。

pList 资源文件如下所示:

<?xml version="1.0" enCoding="UTF-8"?><!DOCTYPE pList PUBliC "-//Apple Computer//DTD PList 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><pList version="1.0">	<dict>        <key>Metadata</key>        <dict>            <key>format</key>            <integer>1</integer>            <key>ptm_ratio</key>            <real>32</real>        </dict>        <key>bodIEs</key>		<dict>			<key>PIC_UI_HG</key>			<dict>				<key>anchorpoint</key>                <string>{ 0.0000,0.0000 }</string>				<key>fixtures</key>				<array>					<dict>                        <key>density</key> <real>2</real>                        <key>friction</key> <real>0</real>                        <key>restitution</key> <real>0</real>                        <key>filter_categoryBits</key> <integer>1</integer>                        <key>filter_groupIndex</key> <integer>0</integer>                        <key>filter_maskBits</key> <integer>65535</integer>                        <key>isSensor</key> <true/>                        <key>ID</key> <string></string>                        <key>fixture_type</key> <string>polyGON</string>						<key>polyGON</key>						<array>							<array>									<string>{ 97.000,126.000 }</string>									<string>{ 98.000,112.000 }</string>									<string>{ 110.000,100.000 }</string>									<string>{ 103.000,125.000 }</string>							</array>							<array>									<string>{ 98.000,112.000 }</string>									<string>{ 78.000,100.000 }</string>									<string>{ 56.000,65.000 }</string>									<string>{ 71.000,23.000 }</string>									<string>{ 99.000,54.000 }</string>									<string>{ 110.000,80.000 }</string>									<string>{ 110.000,100.000 }</string>							</array>							<array>									<string>{ 56.000,65.000 }</string>									<string>{ 26.000,50.000 }</string>									<string>{ 4.000,30.000 }</string>									<string>{ 0.000,16.000 }</string>									<string>{ 6.000,4.000 }</string>									<string>{ 23.000,1.000 }</string>									<string>{ 45.000,6.000 }</string>									<string>{ 71.000,23.000 }</string>							</array>						</array>                    </dict>				</array>			</dict>		</dict>	</dict></pList>

以上数据是从一个Box2d物理对象的pList文件中抽取出来,将其命名为”test.pList”。

第一步:读取pList文件

读取pList文件,由于pList是采用’键’=’值’格式,因此读取其文件,基本采用CCDictionary类读取,代码如下:

	/// 先读取pList文件	CCDictionary *dict = CCDictionary::createWithContentsOffile("test.pList");		CCAssert(dict != NulL,"file not found!");	CCAssert(dict->count() != 0,"file is empty or not existing!");

第二步:读取第一个dict下内容

‘test.pList’文件,首先包括了两个’字典’,第一个字典其’键’key 值为’ Metadata’,我们先通过读取第一个dict下内容,学会如何读取int和float两种类型值,代码如下:

	/// 读取第一个dict下的“Metadata”内容	CCDictionary *MetadataDict = (CCDictionary *)dict->objectForKey("Metadata");	int format = static_cast<CCString *>(MetadataDict->objectForKey("format"))->intValue();			///< 读取“format”值,是一个integer类型	float ptm_ratio = static_cast<CCString *>(MetadataDict->objectForKey("ptm_ratio"))->floatValue();	///< 读取“format”值,是一个real值

第三步:学会轮询dict值

第二个’键’:’ bodIEs’下只有一个dict(其下第二层dict不算),但这里我们当做其包含多个dict来处理,学会轮询dict值,由于预先知道是轮询dict,因此知道其类型为CCDictElement,代码如下:

	/// 读取第二个dict下的“bodIEs”内容	CCDictionary *bodIEsDict = (CCDictionary *)dict->objectForKey("bodIEs");	CCDictElement *dictElem;	std::string bodyname;	CCDictionary *bodyData;	CCDICT_FOREACH(bodIEsDict,dictElem)					///< 轮询bodIEs下多个dict值,test示例中,只有一个	{		bodyData = (CCDictionary*)dictElem->getobject();		///< 获取当前dict内容		bodyname = dictElem->getStrKey();				///< map的key		......			......		......	}

第四步:学会读取队列array值、bool、string值

从’test.pList’文件中,可以看出,’bodIEs’下包含多个array队列,因此我们这一步工作是,如何读取array中的值,由于array中包含多种类型值,因此采用CCObject类型,同时这里面包含多种类型,一一读取这些值,学会读取各种类型值,代码如下:

	const char* pointch = static_cast<CCString *>(bodyData->objectForKey("anchorpoint"))->getCString();	///< 读取“anchorpoint”,是个string,转换成char*,与下面比较 	CCArray *fixtureList = (CCArray*)(bodyData->objectForKey("fixtures"));								///< 读取"fixtures",是一个array	CCObject *arrayElem;	CCARRAY_FOREACH(fixtureList,arrayElem)	{		CCDictionary* fixtureData = (CCDictionary*)arrayElem;	///< 获取当前array内容		/// 读取一些值  		float density = static_cast<CCString *>(fixtureData->objectForKey("density"))->floatValue();		int categoryBits = static_cast<CCString *>(fixtureData->objectForKey("filter_categoryBits"))->intValue();		bool isSensor = static_cast<CCString *>(fixtureData->objectForKey("isSensor"))->boolValue();							std::string fixtureType = static_cast<CCString *>(fixtureData->objectForKey("fixture_type"))->m_sstring;		/// 下面依然是一个array		CCArray *polygonsArray = (CCArray *)(fixtureData->objectForKey("polyGON"));		CCObject *dicArrayElem;		CCARRAY_FOREACH(polygonsArray,dicArrayElem)			///< 第二个array		{			….		}	}

综上,pList文件读写示例完毕,demo下载地址:https://github.com/DionysosLai/FileReadDemo

希望对大家有点用处。

总结

以上是内存溢出为你收集整理的文件 *** 作2之plist文件 *** 作全部内容,希望文章能够帮你解决文件 *** 作2之plist文件 *** 作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1034825.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存