注册忘记密码

自学论坛

自学图文推荐

热门推荐:Win10Win8Win7/XPPS技术教程大全New资讯
查看: 2438|回复: 60

lua文件处理

[复制链接]

24

主题

43

帖子

130

积分

注册会员

Rank: 2Rank: 2

积分
130
发表于 2015-3-22 12:29:52 | 显示全部楼层 |阅读模式
  1. 一。文件读存:
  2.   -- 似乎不支持大文件(不能超过9k?):
  3.   function opensavetest()
  4.   local file = io.open("c:\\in.lua", "r");
  5.   if(file) then
  6.   local data = file:read("*a"); -- i've also tried "*all" as described in PIL

  7.   file:close();
  8.   file = io.open("c:\\out.lua", "w");
  9.   if(file) then
  10.   file:write(data);
  11.   file:close();
  12.   end
  13.   end
  14.   end
  15.   opensavetest();

  16.   二。非循环表格处理(见program in lua):
  17.   HERO = 1 Monster = 2 Building = 3 SumUnit = 4
  18.   cha = {}
  19.   cha[1] =
  20.   {
  21.   basic =
  22.   {
  23.   Name = "农民" , --角色名称
  24.   cha_type = HERO --角色模型类型
  25.   } ,
  26.   Combat =
  27.   {
  28.   acquire = 600.00 , --主动攻击范围
  29.   basic_def = 10 --基础防御
  30.   }
  31.   }
  32.   function serialize2( o)
  33.   if type(o) == "number" then
  34.   g_file:write(o)
  35.   elseif type(o) == "string" then
  36.   g_file:write(string.format("%q", o))
  37.   elseif type(o) == "table" then
  38.   g_file:write("{\n")
  39.   for k,v in pairs(o) do
  40.   g_file:write(" [")
  41.   serialize2(k)
  42.   g_file:write("] = ")
  43.   serialize2(v)
  44.   g_file:write(",\n")
  45.   end
  46.   g_file:write("}\n")
  47.   else
  48.   error("cannot serialize a " .. type(o))
  49.   end
  50.   end
  51.   function savetest ()
  52.   if g_file == nil then
  53.   print("error int 'savetest()'");
  54.   return;
  55.   end
  56.   g_file:write("cha = {}\n")
  57.   g_file:write("cha[1] = {\n")
  58.   serialize2( cha[1] );
  59.   g_file:write("}\n")
  60.   end
  61.   g_file = io.open("c:\\tt.lua", "w");
  62.   savetest();
  63.   g_file:close()

  64.   三。原program in lua中的保存带/不带循环的table
  65.   12.1.1 保存不带循环的table
  66.   我们下一个艰巨的任务是保存表。根据表的结构不同,采取的方法也有很多。没有一种单一的算法对所有情况都能很好地解决问题。简单的表不仅需要简单的算法而且输出文件也需要看起来美观。
  67.   我们第一次尝试如下:
  68.   function serialize (o)
  69.   if type(o) == "number" then
  70.   io.write(o)
  71.   elseif type(o) == "string" then
  72.   io.write(string.format("%q", o))
  73.   elseif type(o) == "table" then
  74.   io.write("{\n")
  75.   for k,v in pairs(o) do
  76.   io.write(" ", k, " = ")
  77.   serialize(v)
  78.   io.write(",\n")
  79.   end
  80.   io.write("}\n")
  81.   else
  82.   error("cannot serialize a " .. type(o))
  83.   end
  84.   end

  85.   尽管代码很简单,但很好地解决了问题。只要表结构是一个树型结构(也就是说,没有共享的子表并且没有循环),上面代码甚至可以处理嵌套表(表中表)。对于所进不整齐的表我们可以少作改进使结果更美观,这可以作为一个练习尝试一下。(提示:增加一个参数表示缩进的字符串,来进行序列化)。前面的函数假定表中出现的所有关键字都是合法的标示符。如果表中有不符合Lua语法的数字关键字或者字符串关键字,上面的代码将碰到麻烦。一个简单的解决这个难题的方法是将:
  86.   io.write(" ", k, " = ")
  87.   改为
  88.   io.write(" [")
  89.   serialize(k)
  90.   io.write("] = ")
  91.   这样一来,我们改善了我们的函数的健壮性,比较一下两次的结果:
  92.   -- result of serialize{a=12, b='Lua', key='another "one"'}
  93.   -- 第一个版本
  94.   {
  95.   a = 12,
  96.   b = "Lua",
  97.   key = "another "one"",
  98.   }
  99.   -- 第二个版本
  100.   {
  101.   ["a"] = 12,
  102.   ["b"] = "Lua",
  103.   ["key"] = "another "one"",
  104.   }

  105.   我们可以通过测试每一种情况,看是否需要方括号,另外,我们将这个问题留作一个练习给大家。
  106.   12.1.2 保存带有循环的table
  107.   针对普通拓扑概念上的带有循环表和共享子表的table,我们需要另外一种不同的方法来处理。构造器不能很好地解决这种情况,我们不使用。为了表示循环我们需要将表名记录下来,下面我们的函数有两个参数:table和对应的名字。另外,我们还必须记录已经保存过的table以防止由于循环而被重复保存。我们使用一个额外的table来记录保存过的表的轨迹,这个表的下表索引为table,而值为对应的表名。
  108.   我们做一个限制:要保存的table只有一个字符串或者数字关键字。下面的这个函数序列化基本类型并返回结果。
  109.   function basicSerialize (o)
  110.   if type(o) == "number" then
  111.   return tostring(o)
  112.   else -- assume it is a string
  113.   return string.format("%q", o)
  114.   end
  115.   end

  116.   关键内容在接下来的这个函数,saved这个参数是上面提到的记录已经保存的表的踪迹的table。
  117.   function save (name, value, saved)
  118.   saved = saved or {} -- initial value
  119.   io.write(name, " = ")
  120.   if type(value) == "number" or type(value) == "string" then
  121.   io.write(basicSerialize(value), "\n")
  122.   elseif type(value) == "table" then
  123.   if saved[value] then -- value already saved?
  124.   -- use its previous name
  125.   io.write(saved[value], "\n")
  126.   else
  127.   saved[value] = name -- save name for next time
  128.   io.write("{}\n") -- create a new table
  129.   for k,v in pairs(value) do -- save its fields
  130.   local fieldname = string.format("%s[%s]", name,
  131.   basicSerialize(k))
  132.   save(fieldname, v, saved)
  133.   end
  134.   end
  135.   else
  136.   error("cannot save a " .. type(value))
  137.   end
  138.   end

  139.   举个例子:
  140.   我们将要保存的table为:
  141.   a = {x=1, y=2; {3,4,5}}
  142.   a[2] = a -- cycle
  143.   a.z = a[1] -- shared sub-table
  144.   调用save('a', a)之后结果为:
  145.   a = {}
  146.   a[1] = {}
  147.   a[1][1] = 3
  148.   a[1][2] = 4
  149.   a[1][3] = 5
  150.   a[2] = a
  151.   a["y"] = 2
  152.   a["x"] = 1
  153.   a["z"] = a[1]
  154.   (实际的顺序可能有所变化,它依赖于table遍历的顺序,不过,这个算法保证了一个新的定义中需要的前面的节点都已经被定义过)
  155.   如果我们想保存带有共享部分的表,我们可以使用同样table的saved参数调用save函数,例如我们创建下面两个表:
  156.   a = {{"one", "two"}, 3}
  157.   b = {k = a[1]}
  158.   保存它们:
  159.   save('a', a)
  160.   save('b', b)
  161.   结果将分别包含相同部分:
  162.   a = {}
  163.   a[1] = {}
  164.   a[1][1] = "one"
  165.   a[1][2] = "two"
  166.   a[2] = 3
  167.   b = {}
  168.   b["k"] = {}
  169.   b["k"][1] = "one"
  170.   b["k"][2] = "two"
  171.   然而如果我们使用同一个saved表来调用save函数:
  172.   local t = {}
  173.   save('a', a, t)
  174.   save('b', b, t)
  175.   结果将共享相同部分:
  176.   a = {}
  177.   a[1] = {}
  178.   a[1][1] = "one"
  179.   a[1][2] = "two"
  180.   a[2] = 3
  181.   b = {}
  182.   b["k"] = a[1]
  183.   上面这种方法是Lua中常用的方法,当然也有其他一些方法可以解决问题。比如,我们可以不使用全局变量名来保存,即使用封包,用chunk构造一个local值然后返回之;通过构造一张表,每张表名与其对应的函数对应起来等。Lua给予你权力,由你决定如何实现。
复制代码


回复

使用道具 举报

0

主题

17

帖子

51

积分

注册会员

Rank: 2Rank: 2

积分
51
发表于 2015-5-7 21:46:46 | 显示全部楼层
难得一见的好帖
回复 支持 反对

使用道具 举报

0

主题

17

帖子

51

积分

注册会员

Rank: 2Rank: 2

积分
51
发表于 2015-5-7 21:53:01 | 显示全部楼层
自学论坛一直都很好
回复 支持 反对

使用道具 举报

0

主题

18

帖子

56

积分

注册会员

Rank: 2Rank: 2

积分
56
发表于 2015-5-7 21:59:57 | 显示全部楼层
支持楼主,大家要围观哟
回复 支持 反对

使用道具 举报

0

主题

18

帖子

54

积分

注册会员

Rank: 2Rank: 2

积分
54
发表于 2015-5-7 22:16:46 | 显示全部楼层
很不错
回复 支持 反对

使用道具 举报

0

主题

18

帖子

56

积分

注册会员

Rank: 2Rank: 2

积分
56
发表于 2015-5-7 22:21:38 | 显示全部楼层
不错不错
回复 支持 反对

使用道具 举报

0

主题

15

帖子

51

积分

注册会员

Rank: 2Rank: 2

积分
51
发表于 2015-5-12 09:53:06 | 显示全部楼层
九九自学也是你们的?
回复 支持 反对

使用道具 举报

0

主题

13

帖子

51

积分

注册会员

Rank: 2Rank: 2

积分
51
发表于 2015-5-12 09:55:01 | 显示全部楼层
有自考内容没啊
[url=http://www.parentscontreladrogue.com/config.php?q=?cat=10]abercrombie holli
回复 支持 反对

使用道具 举报

0

主题

17

帖子

53

积分

注册会员

Rank: 2Rank: 2

积分
53
发表于 2015-5-13 11:12:25 | 显示全部楼层
很不错
回复 支持 反对

使用道具 举报

0

主题

17

帖子

53

积分

注册会员

Rank: 2Rank: 2

积分
53
发表于 2015-5-13 11:37:52 | 显示全部楼层
自学内容真不少
回复 支持 反对

使用道具 举报

0

主题

16

帖子

54

积分

注册会员

Rank: 2Rank: 2

积分
54
发表于 2015-5-13 11:42:08 | 显示全部楼层
真心顶
回复 支持 反对

使用道具 举报

0

主题

16

帖子

56

积分

注册会员

Rank: 2Rank: 2

积分
56
发表于 2015-5-13 12:09:47 | 显示全部楼层
支持楼主,大家要围观哟
回复 支持 反对

使用道具 举报

0

主题

16

帖子

52

积分

注册会员

Rank: 2Rank: 2

积分
52
发表于 2015-5-13 12:12:07 | 显示全部楼层
有自考内容没啊
[url=http://www.luisabeautyland.com/2014/08/le-mie-extension-con-clips-vpfashion
回复 支持 反对

使用道具 举报

0

主题

15

帖子

51

积分

注册会员

Rank: 2Rank: 2

积分
51
发表于 2015-5-13 12:13:52 | 显示全部楼层
楼主是超人
回复 支持 反对

使用道具 举报

0

主题

19

帖子

59

积分

注册会员

Rank: 2Rank: 2

积分
59
发表于 2015-5-13 12:34:58 | 显示全部楼层
说的非常好
回复 支持 反对

使用道具 举报

0

主题

14

帖子

52

积分

注册会员

Rank: 2Rank: 2

积分
52
发表于 2015-5-13 12:37:37 | 显示全部楼层
九九自学也是你们的?
回复 支持 反对

使用道具 举报

0

主题

16

帖子

56

积分

注册会员

Rank: 2Rank: 2

积分
56
发表于 2015-5-13 13:32:49 | 显示全部楼层
很好哦
回复 支持 反对

使用道具 举报

0

主题

15

帖子

53

积分

注册会员

Rank: 2Rank: 2

积分
53
发表于 2015-5-13 13:35:03 | 显示全部楼层
不错不错
回复 支持 反对

使用道具 举报

0

主题

17

帖子

59

积分

注册会员

Rank: 2Rank: 2

积分
59
发表于 2015-5-17 10:06:07 | 显示全部楼层
我每天都来的
回复 支持 反对

使用道具 举报

0

主题

17

帖子

59

积分

注册会员

Rank: 2Rank: 2

积分
59
发表于 2015-5-17 10:22:42 | 显示全部楼层
自学社区好啊
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

快速回复 返回顶部 返回列表