Lua文件处理

来源: LUPA开源社区
发布时间: 2007-07-02 13:36 版权申明

字体:


文章来源于http://www.lupaworld.com
一。文件读存:
-- 似乎不支持大文件(不能超过9k?):
function opensavetest()
   local file = io.open("c:\\in.lua", "r");
   if(file) then
   local data = file:read("*a"); -- i've also tried "*all" as described in PIL
   file:close();
   file = io.open("c:\\out.lua", "w");
   if(file) then
   file:write(data);
   file:close();
   end
   end
end
opensavetest();
 
二。非循环表格处理(见program in lua):
HERO = 1  Monster = 2  Building = 3 SumUnit = 4
cha = {}
cha[1] =
{
 basic =
  {
   Name = "农民" ,       --角色名称
   cha_type = HERO        --角色模型类型
  } ,
 Combat =
  {
     acquire = 600.00 ,       --主动攻击范围
     basic_def = 10        --基础防御
  }
}
function serialize2( o)
 if type(o) == "number" then
  g_file:write(o)
 elseif type(o) == "string" then
  g_file:write(string.format("%q", o))
 elseif type(o) == "table" then
  g_file:write("{\n")
  for k,v in pairs(o) do
   g_file:write(" [")
   serialize2(k)
   g_file:write("] = ")
   serialize2(v)
   g_file:write(",\n")
  end
  g_file:write("}\n")
 else
  error("cannot serialize a " .. type(o))
 end
end
function savetest ()
 if g_file == nil then
      print("error int 'savetest()'");
      return;
   end
 g_file:write("cha = {}\n")
 g_file:write("cha[1] = {\n")
 serialize2( cha[1] ); 
 g_file:write("}\n")
end
g_file = io.open("c:\\tt.lua", "w");
savetest();
g_file:close()
 
三。原program in lua中的保存带/不带循环的table
12.1.1 保存不带循环的table
我们下一个艰巨的任务是保存表。根据表的结构不同,采取的方法也有很多。没有一种单一的算法对所有情况都能很好地解决问题。简单的表不仅需要简单的算法而且输出文件也需要看起来美观。
我们第一次尝试如下:
function serialize (o)
 if type(o) == "number" then
  io.write(o)
 elseif type(o) == "string" then
  io.write(string.format("%q", o))
 elseif type(o) == "table" then
  io.write("{\n")
  for k,v in pairs(o) do
   io.write(" ", k, " = ")
   serialize(v)
   io.write(",\n")
  end
  io.write("}\n")
 else
  error("cannot serialize a " .. type(o))
 end
end
尽管代码很简单,但很好地解决了问题。只要表结构是一个树型结构(也就是说,没有共享的子表并且没有循环),上面代码甚至可以处理嵌套表(表中表)。对于所进不整齐的表我们可以少作改进使结果更美观,这可以作为一个练习尝试一下。(提示:增加一个参数表示缩进的字符串,来进行序列化)。前面的函数假定表中出现的所有关键字都是合法的标示符。如果表中有不符合Lua语法的数字关键字或者字符串关键字,上面的代码将碰到麻烦。一个简单的解决这个难题的方法是将:
io.write(" ", k, " = ")
改为
io.write(" [")
serialize(k)
io.write("] = ")
这样一来,我们改善了我们的函数的健壮性,比较一下两次的结果:
-- result of serialize{a=12, b='Lua', key='another "one"'}
-- 第一个版本
{
a = 12,
b = "Lua",
key = "another \"one\"",
}
-- 第二个版本
{
["a"] = 12,
["b"] = "Lua",
["key"] = "another \"one\"",
}
我们可以通过测试每一种情况,看是否需要方括号,另外,我们将这个问题留作一个练习给大家。
12.1.2 保存带有循环的table
针对普通拓扑概念上的带有循环表和共享子表的table,我们需要另外一种不同的方法来处理。构造器不能很好地解决这种情况,我们不使用。为了表示循环我们需要将表名记录下来,下面我们的函数有两个参数:table和对应的名字。另外,我们还必须记录已经保存过的table以防止由于循环而被重复保存。我们使用一个额外的table来记录保存过的表的轨迹,这个表的下表索引为table,而值为对应的表名。
我们做一个限制:要保存的table只有一个字符串或者数字关键字。下面的这个函数序列化基本类型并返回结果。
function basicSerialize (o)
 if type(o) == "number" then
  return tostring(o)
 else  -- assume it is a string
  return string.format("%q", o)
 end
end
关键内容在接下来的这个函数,saved这个参数是上面提到的记录已经保存的表的踪迹的table。
function save (name, value, saved)
 saved = saved or {}   -- initial value
 io.write(name, " = ")
 if type(value) == "number" or type(value) == "string" then
  io.write(basicSerialize(value), "\n")
 elseif type(value) == "table" then
  if saved[value] then  -- value already saved?
   -- use its previous name
   io.write(saved[value], "\n")
  else
   saved[value] = name -- save name for next time
   io.write("{}\n")  -- create a new table
   for k,v in pairs(value) do -- save its fields
    local fieldname = string.format("%s[%s]", name,
           basicSerialize(k))
    save(fieldname, v, saved)
   end
  end
 else
  error("cannot save a " .. type(value))
 end
end
举个例子:
我们将要保存的table为:
a = {x=1, y=2; {3,4,5}}
a[2] = a  -- cycle
a.z = a[1]  -- shared sub-table
调用save('a', a)之后结果为:
a = {}
a[1] = {}
a[1][1] = 3
a[1][2] = 4
a[1][3] = 5
a[2] = a
a["y"] = 2
a["x"] = 1
a["z"] = a[1]
(实际的顺序可能有所变化,它依赖于table遍历的顺序,不过,这个算法保证了一个新的定义中需要的前面的节点都已经被定义过)
如果我们想保存带有共享部分的表,我们可以使用同样table的saved参数调用save函数,例如我们创建下面两个表:
a = {{"one", "two"}, 3}
b = {k = a[1]}
保存它们:
save('a', a)
save('b', b)
结果将分别包含相同部分:
a = {}
a[1] = {}
a[1][1] = "one"
a[1][2] = "two"
a[2] = 3
b = {}
b["k"] = {}
b["k"][1] = "one"
b["k"][2] = "two"
然而如果我们使用同一个saved表来调用save函数:
local t = {}
save('a', a, t)
save('b', b, t)
结果将共享相同部分:
a = {}
a[1] = {}
a[1][1] = "one"
a[1][2] = "two"
a[2] = 3
b = {}
b["k"] = a[1]
上面这种方法是Lua中常用的方法,当然也有其他一些方法可以解决问题。比如,我们可以不使用全局变量名来保存,即使用封包,用chunk构造一个local值然后返回之;通过构造一张表,每张表名与其对应的函数对应起来等。Lua给予你权力,由你决定如何实现。
文章来源于http://www.lupaworld.com

声明:LUPA开源社区刊登此文只为传递信息,并不表示赞同或者反对。

查看全部评论(1) 最新评论

  • 删除 Guest (, 评 0 分) 支持 反对

    在“北京名鼎[url=http://www.dvd2duplication.com]木盒厂[/url]”看来,其他[url=http://www.dvd2duplication.com]木盒厂[/url]的做法不能完全发挥高档[url=http://www.dvd2duplication.com]木盒[/url]提升产品档次和销售的优势速度,早晚会被真正的高档[url=http://www.trainingskill.com]包装盒[/url]所取代如果你想在一个产品发布会上,正愁不知道以什么方式来体现产品的档次与特色,那你就可以到互联网上搜索相关的高档[url=http://www.trainingskill.com]礼品盒制作[/url]的相关信息。提供[url=http://www.trainingskill.com]包装盒[/url]定做服务的厂商很多,但在我们这里提到的,而是一个有创意设计,采用环保材料的[url=http://www.dvd2duplication.com]木盒制作[/url]厂商——名鼎[url=http://www.dvd2duplication.com]木盒厂[/url]。这是一家2005年6月才正式开始运营的[url=http://www.dvd2duplication.com]木盒厂[/url],提供[url=http://www.dvd2duplication.com]木盒制作[/url],[url=http://www.dvd2duplication.com]木盒设计[/url],[url=http://www.dvd2duplication.com]木盒定做[/url]服务。您可以登陆“北京名鼎[url=http://www.dvd2duplication.com]木盒厂[/url]”网站:([url=http://www.dvd2duplication.com]www.dvd2duplication.com[/url]),查询[url=http://www.dvd2duplication.com]木盒制作[/url]的详细信息。网站分为一下板块:[url=http://www.dvd2duplication.com]木盒、木盒包装、木盒制作、木盒加工厂[/url]、
    [url=http://www.dvd2duplication.com/index.asp]木盒、木盒包装、木盒制作、木盒加工厂[/url]、[url=http://www.dvd2duplication.com/mh.asp]木盒[/url][url=http://www.dvd2duplication.com/mhz.asp]木盒子[/url]、[url=http://www.dvd2duplication.com/mhbz.asp]木盒包装[/url]、[url=http://www.dvd2duplication.com/mhc.asp]木盒厂[/url]、[url=http://www.dvd2duplication.com/mhbzc.asp]木盒包装厂[/url]、[url=http://www.dvd2duplication.com/mhzz.asp]木盒制作[/url]、[url=http://www.dvd2duplication.com/mhjgc.asp]木盒加工厂[/url]、[url=http://www.dvd2duplication.com/mhsj.asp]木盒设计[/url]、[url=http://www.dvd2duplication.com/bjmhc.asp]北京木盒厂[/url]、[url=http://www.dvd2duplication.com/bjmhbzc.asp]北京木盒包装厂[/url]、[url=http://www.dvd2duplication.com/mzlph.asp]木制礼品盒[/url]、[url=http://www.dvd2duplication.com/mhzzbj.asp]木盒制作北京[/url]、详细说明了:[url=http://www.dvd2duplication.com]木盒制作[/url],[url=http://www.dvd2duplication.com]木盒[/url]定做,[url=http://www.dvd2duplication.com]木盒[/url]设计以及[url=http://www.dvd2duplication.com]木盒[/url]图片等,网站还提供了各类[url=http://www.dvd2duplication.com]木盒制作[/url]的材料,[url=http://www.dvd2duplication.com]木盒[/url]定做所需内衬等相关信息。除了[url=http://www.dvd2duplication.com]木盒[/url]制作所需信息外,“名鼎[url=http://www.dvd2duplication.com]木盒厂[/url]”还提供了[url=http://www.dvd2duplication.com]木盒[/url]制作所需的相关设计方案等。北京名鼎礼品盒厂网站主要分为一下板块:[url=http://www.trainingskill.com] 包装盒、礼品包装盒、礼品盒、木盒包装、工艺品包装盒,高档包装盒,礼品盒订做[/url]、[url=http://www.trainingskill.com/index.asp] 包装盒、礼品包装盒、礼品盒、木盒包装、工艺品包装盒,高档包装盒,礼品盒订做[/url]、[url=http://www.trainingskill.com/bjpbzh.asp]保健品包装盒[/url]、[url=http://www.trainingskill.com/cyh.asp]茶叶盒[/url]、[url=http://www.trainingskill.com/gifeboxe.asp]礼品盒子[/url]、[url=http://www.trainingskill.com/gifeboxesmade.asp]礼品盒制作[/url]、[url=http://www.trainingskill.com/gifeboxespacking.asp]礼品盒包装[/url]、[url=http://www.trainingskill.com/gifeboxessccj.asp]礼品盒生产厂家[/url]、[url=http://www.trainingskill.com/gifeboxessj.asp]礼品盒设计[/url]、[url=http://www.trainingskill.com/gifepackingboxes.asp]礼品包装盒[/url]、[url=http://www.trainingskill.com/gifesboxes.asp]礼品盒[/url]、[url=http://www.trainingskill.com/gifewoodenboxeszz.asp]礼品木盒制作[/url]、[url=http://www.trainingskill.com/gypbzh.asp]工艺品包装盒[/url]、[url=http://www.trainingskill.com/packc.asp]包装盒厂[/url]、[url=http://www.trainingskill.com/packczz.asp]包装盒制作[/url]、[url=http://www.trainingskill.com/packingboxes.asp]包装盒[/url]、[url=http://www.trainingskill.com/qbscc.asp]钱币收藏册[/url]、[url=http://www.trainingskill.com/ssh.asp]首饰盒[/url]、[url=http://www.trainingskill.com/woodenbzh.asp]木制包装盒[/url]、[url=http://www.trainingskill.com/ybh.asp]月饼盒[/url]、[url=http://www.trainingskill.com/youcezz.asp]邮册制作[/url],详细的介绍了各类包装盒制作信息![url=http://www.dvd2duplication.com]木盒定做[/url]“名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”的优势在于[url=http://www.dvd2duplication.com]木盒[/url]的设计风格、用材、以及为客户的所想而做。“北京名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”是把目前世界上以及国内最流行的设计方案整合于一体,再结合客户所需设计制作出高档的[url=http://www.trainingskill.com]礼品包装盒[/url]。“名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”在为客户提供[url=http://www.trainingskill.com]礼品盒制作[/url]设计方案时,提供多种选择,如果能有多种材料供选择,都可以做出高档的[url=http://www.trainingskill.com]礼品盒[/url],北京名鼎[url=http://www.dvd2duplication.com]木盒包装[/url]厂,尽量推荐环保材料、可以节省成本的[url=http://www.trainingskill.com]礼品包装盒[/url],这样客户可以实时比较分析,找到更高档,更精致,多省钱的[url=http://www.trainingskill.com]礼品盒制作[/url]方案。用户对[url=http://www.dvd2duplication.com]木盒[/url]礼品包装的需要确实是巨大的。从去年6月正式运营以来,“北京名鼎[url=http://www.dvd2duplication.com]木盒包装[/url]”的[url=http://www.dvd2duplication.com]木盒制作[/url]订单每天都排的满满的,“名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”的网站:[url=http://www.trainingskill.com]www.trainingskill.com[/url]和[url=http://www.dvd2duplication.com]www.dvd2duplication.com[/url]的访问量也在不断的上升。名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂的负责人王雯告诉记者:“现在‘名鼎[url=http://www.trainingskill.com]礼品盒[/url]厂’网站的流量基本保持了每两三个月就翻一番的态势,70万的流量还只是2、3月份的数据,4月数据还没有拿到,但一定会大大超过,到今年年底我们的流量将比2月份再翻一番。”最让人欣喜的是,“北京名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”喊出了这样的口号:在“名鼎[url=http://www.dvd2duplication.com]木盒厂[/url]”制作出的[url=http://www.dvd2duplication.com]木盒[/url]和[url=http://www.trainingskill.com]礼品盒[/url],一定要比别人的更精致,更便宜!

    开始盈利

    [url=http://www.dvd2duplication.com]木盒[/url]厂运作的一个重要法则就是以人为本。为客户提供好的服务,同样的材料、同样的价格要做出的[url=http://www.dvd2duplication.com]木盒[/url]、[url=http://www.trainingskill.com]礼品盒[/url]要比别的厂家做的更高档、更能体现客户的品味。王雯说,他们的[url=http://www.trainingskill.com]礼品盒厂[/url]早开始盈利。这是一个好的标志,至少说明“北京名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”的[url=http://www.dvd2duplication.com]木盒[/url]和[url=http://www.dvd2duplication.com]礼品盒[/url]得到了大家的认可
      王雯告诉记者,“北京名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”刚刚和北京奥组委签订协议,制作北京2008年奥运会的[url=http://www.trainingskill.com]礼品包装盒[/url]、奥运集邮册。和中国铸币总公司签订了制作金币高档[url=http://www.trainingskill.com]包装盒[/url]等等,特别是特别是香港及海外客户不断增加,“北京名鼎[url=http://www.dvd2duplication.com]木盒厂[/url]”获得了市场的认可。
      “北京名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂”之所以能发展迅速,主要是靠实实在在为客户,不管是大客户,小客户都是我们的客户,尽量做到价格透明,所用材料真实!

    创业团队

    北京名鼎[url=http://www.dvd2duplication.com]木盒[/url]厂"的团队都有丰富的[url=http://www.dvd2duplication.com]木盒[/url],[url=http://www.trainingskill.com]礼品盒制作[/url]经验。北京名鼎[url=http://www.trainingskill.com]礼品盒厂[/url]现有员工300多人,产品加工以机器为主导,辅以人工后包装,人工操作实行流水作业,成套的设备生产和日益完善的管理,可满足客户不同层次,不同种类的包装,为您提供高品质的保证。目前北京名鼎木盒厂生产制作的[url=http://www.dvd2duplication.com]木盒[/url],[url=http://www.trainingskill.com]纸盒[/url]广泛应用到了各行各业,有[url=http://www.trainingskill.com]月饼包装盒[/url]、[url=http://www.trainingskill.com]茶叶包装盒[/url]、[url=http://www.trainingskill.com]化妆品包装盒[/url]、[url=http://www.trainingskill.com]工艺品包装盒[/url]等!
    [url=http://www.abcong.com]光盘制作[/url]|[url=http://www.koozent.com]光盘制作[/url]|[url=http://www.disc2008.com]光盘刻录[/url]| [url=http://www.67399670.com]光盘印刷[/url]|[url=http://www.nshoping.com]光盘厂[/url]|[url=http://www.nowshoping.com]光盘制作[/url]|[url=http://www.cpackaging.net]光盘包装[/url][url=http://www.kangyawei.com/xpCatalog_xpDesc.asp?action_key_order=big&shopxpbe_id=54]木制包装盒[/url][url=http://www.2016aoyun.com/lyindex.html]木制礼品盒[/url][url=http://www.2012aoyun.com]礼品盒[/url] 10104

查看全部评论(1)我来说两句 直接向LUPA提出您的宝贵建议

-5 -3 -1 - +1 +3 +5