加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua杂记一:文件读写、table库、字符串库

发布时间:2020-12-14 22:22:06 所属栏目:大数据 来源:网络整理
导读:一、table的解释(云风说的很好,摘抄如下): ???? lua?的整体效率是很高的,其中,它的?table?实现的很巧妙为这个效率贡献很大。 lua?的?table?充当了数组和映射表的双重功能,所以在实现时就考虑了这些,让?table?在做数组使用时尽量少效率惩罚。 lua?是

一、table的解释(云风说的很好,摘抄如下):????

lua?的整体效率是很高的,其中,它的?table?实现的很巧妙为这个效率贡献很大。

lua?的?table?充当了数组和映射表的双重功能,所以在实现时就考虑了这些,让?table?在做数组使用时尽量少效率惩罚。

lua?是这样做的。它把一个?table?分成数组段和?hash?段两个部分。数字?key?一般放在数组段中,没有初始化过的?key?值全部设置为?nil?。当数字?key?过于离散的时候,部分较大的数字?key?会被移到?hash段中去。这个分割线是以数组段的利用率不低于?50%?为准。?0?和?负数做?key?时是肯定放在?hash?段中的。

string?和?number?都放在一起做?hash?,分别有各自的算法,但是?hash?的结果都在一个数值段中。hash?段采用闭散列方法,即,所有的值都存在于表中。如果hash?发生碰撞,额外的数据记在空闲槽位里,而不额外分配空间存放。当整个个表放满后,hash?段会扩大,所有段内的数据将被重新?hash?,重新?hash?后,冲突将大大减少。

这种?table?的实现策略,首先保证的是查找效率。对于把?table?当数组使用时将和?C?数组一样高效。对于?hash?段的值,查找几乎就是计算?hash?值的过程(其中string?的?hash?值是事先计算好保存的),只有在碰撞的时候才会有少许的额外查找时间,而空间也不至于过于浪费。在?hash?表比较满时,插入较容易发生碰撞,这个时候,则需要在表中找到空的插槽。lua?在table?的结构中记录了一个指针顺次从一头向另一头循序插入来解决空槽的检索。每个槽点在记录?next?指针保存被碰撞的?key?的关联性。

整个来说,这种解决方法是非常不错的。

关于映射表的实现,我前段时间也做过一个别的研究。贴在留言本上:
<a?href="http://www.codingnow.com/2004/board/view.php?paster=777&reply=0">树表结合的一种映射表实现</a>
<?a?href="http://www.codingnow.com/2004/board/view.php?paster=776&reply=0">在?vector?,?map?,?list?间取得平衡</a>

二、文件读写

文件读写对制作游戏很有帮助。可以调用别的文件中的代码,保存最高分、游戏存档、玩家状态等信写到文件中。

首先,让我们看一个简单的命令:dofile。这个命令会读入另一个文件的代码并立即执行。

代码:

dofile("./test.lua")?

很简单的命令。注意?./?是指根目录,不是子目录。如果是子目录,应该这样用:

代码:

dofile("./files/test.lua")?

  那么,如果我们的文件?test.lua?包含下述代码:

代码:

playerx?=?10?playery?=?20?enemyx?=?40?enemyy?=?50?

  一旦我们用?dofile?调用这个文件,这些变量将立即得到声明。文件不是非得用?lua?后缀,txt?或其他后缀都可以。

从文件中读取一行:

  假设你有一个很多行文本的文件,你想从中读取一行,并打印到屏幕上。为此我们可以使用?io.open()?命令打开文件并读取。

  命令的语法是?io.open(filename,?mode)。此处我们将使用?r?作为?mode?的值,意指读取(read)模式。作为参考,下面是所有可用模式的列表:

引用:

r?-?读取模式w?-?写入模式(覆盖现有内容)

a?-?附加模式(附加在现有内容之后)

b?-?二进制模式

r+?-?读取更新模式(现有数据保留)

w+?-?写入更新模式(现有数据擦除)

a+?-?附加更新模式(现有数据保留,只在文件末尾附加)

第一件要做的事情就是打开文件并存为一个变量。看下面。

代码:

file?=?io.open("testRead.txt",?"r")?

  现在我们的文件?testRead.txt?已打开并处于读取模式。接着我们使用?read()?命令读取文件中的单行内容存为另一个变量。

代码:

ourline?=?file:read()?

  这将读取我们的文本文件的第一行。下一次我们使用?read()?命令它将读取第二行。再下一次它会读取第三行,依此类推。

  请注意,此命令前的?file?是我们之前打开文件并保存的变量名,你可以使用任何其他名字。file.read()?还可以使用下列任一个参数,只要用引号括起来放入括号里就可以。

引用:

*n?-?读取一个数字并返回它。例:file.read("*n")

*a?-?从当前位置读取整个文件。例:file.read("*a")

*l?-?(默认)?-?读取下一行,在文件尾?(EOF)?处返回?nil。例:file.read("*l")

number?-?返回一个指定字符个数的字符串,或在?EOF?时返回?nil。例:file.read(5)

既然我们已经读取到所要的那一行,我们需要关闭打开的文件,像这样:

代码:

file:close()?

  现在要打印我们的文件至屏幕我们只要这么做:

代码:

screen:print(10,10,ourline,white)?

读取所有行  

要读取一个文件的所有行,你可以在一个?for?语句中使用上述技巧。请看下述代码:

代码:

y?=?10

file?=?io.open("testRead.txt","r")

for?line?in?file:lines()?do

?????y?=?y?+?10

?????screen:print(100,y,line,white)

endf

ile:close()?

  这个代码设置了一个起始值?y?用于打印,这样它可以在屏幕不同的纵坐标打印每一行。照例,先打开文件。然后是?for?语句,这句代码是说文件的行数有多少下面的代码就执行几次。我们的?y?坐标则每次循环加上?10?以便打印命令可以打印下一行。

写入文件(覆盖)

  写入文件的方式大致相同。下面的代码将覆盖任何先前写入文件的内容:

代码:

file?=?io.open("testRead.txt","w")file:write("hello")file:close()?

  注意,我们这次使用了?w?模式,而不是?r?模式,因为我们是要写入而不是读取。我们用?file:write()?写入括号里作为参数的、用引号括起来的文本。你也可以用变量替代。如果你使用变量就不要用引号,请看下例:

代码:

file?=?io.open("testRead.txt","w")myText?=?"Hello"file:write(myText)file:close()?

写入文件(附加)

  你可以使用附加模式,这样就可以在写入文件时将新内容附加在已有文本末尾,而不是删除原来的。做法与上面基本相同,除了模式换成“附加”之外。请看代码:

代码:

file?=?io.open("testRead.txt","a")myText?=?"nHello"file:write(myText)file:close()?

?

三、字符串库

?

四、其他

1、取table长度操作符 #

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读