Lua从入门到放弃--文件I/O

如果一个多年没联系的同学突然发微信给你,只有以下三种情况:1、他要结婚了。2、他要做微商了。3、他孩子参加某某比赛让你去投票。我们友谊的小船就这么说翻就翻了。再见


lua的I/O库用于读取和处理文件。分为以下两种模式:

简单模式(和C一样):拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件的操作。

完全模式:使用外部的文件句柄来实现。她以一种面向对象的形式,将所有的文件操作定义为文件句柄的方法。

适用场景:
简单模式在一些简单的文件操作时较为合适,但是如果我们想进行一些高级的文件操作的时候,简单模式就满足不了我们了。比如我们想同时操作多个文件时,我们使用完全模式则会比较合适。

打开文件的操作语句:
file = io.open(filename, [, mode])

mode的值有以下几种:



简单模式:

简单模式使用标准的I/O或使用一个当前输入文件和一个当前输出文件。

下面我们来写一个简单的示例:

myFile = io.open("test_data.lua", "w")
if myFile ~= nil then
myFile:write("-- Test lua file")
myFile:write(string.char(10))
myFile:write(string.char(10))
myFile:write(string.format("%s%s", "-- File created on: ", os.time()))
myFile:write(string.char(10))
myFile:write(string.char(10))
myFile:write("print(\"hello world\")")
io.close(myFile)

end

这个例子中我们打开了一个文件并使用write()函数写入数据。string.char()函数写入换行符。io.close()为关闭文件。运行之后会生成一个test_data.lua的文件,在终端中直接运行该文件,可以输出hello world。

再看下面两个例子:

file1 = io.open("test_data.lua" , "r")

if file1 ~= nil then

io.input(file1)    -- 设置默认输入文件为test_data.lua

print(io.read())    -- 输出文件第一行

io.close(file1)

end

file2 = io.open("test_data.lua", "a")

if file2 ~= nil then

io.output(file)    -- 设置默认输入文件为test_data.lua

io.write("-- test_data.lua 文件末尾注释")    

io.close(file2)

end

在上实例中我们使用了io.read()方法,我们没有带任何参数,参数可以是下表中的一个:


其他的io方法有:

io.tmpfile():返回一个临时的文件句柄,该文件以更新模式打开,在程序运行结束时自动删除。

io.type(file):检测obj是否是一个可用的文件句柄。

io.flush():向文件写入缓冲中的所有数据。

io.lines(optional file name):返回一个迭代函数,每次调用将获得文件中的一行内容,如果多次运行该函数,会以此向下获取每一行,知道文件尾时,将返回nil,但不会关闭文件。


完全模式:

有时我们需要同时处理多个文件,我们需要使用file:function_name来代替io.function_name方法。示例如下:

file = io.open("test_data.lua, "r")

if file ~= nil then

print(file:read())

file:close()

end

myfile = io.open("test_data.lua", "a")

if myfile ~= nil then

myfile:write("-- test_data.lua")
myfile:close()

end

上面的示例如同同时处理同一个文件。

read的参数和简单模式一致。

除了上面所说的方法,完全模式还有一些其他的方法如:

file:seek(optional whence, optional offset)设置和获取当前文件位置,成功则返回最终的文件位置(按字节), 失败则返回nil加错误信息,参数whence值可以是:

"set":从文件头开始

"cur":从当前位置开始[默认]

"end":从文件尾开始

"offset":默认为0

不带参数file:seek()则返回当前位置,file:seek("set")则定位到文件开头,file:seek("end")则定位到文件尾并返回文件大小。

我们在test_data.lua里面先写入hello world

file = io.open("test_data.lua", "r")

if file ~= nil then

print(file:seek("set")         -- 0

print(file:seek("cur")         -- 0

print(file:seek("end")        -- 11

print(file:seek("end", 5)   -- 16,原有的11个字符,向右偏移5,结果为16。如果为-5,则向左偏移5。

file:close()

end

file:flush():向文件写入缓冲的所有数据。

io.lines(optional file name):打开指定的文件filename为读模式并返回一个迭代函数。每次调用将获得文件中的一行内容,当读取到文件尾部时,返回nil,并自动关闭文件。

示例:

我们在test_data.lua提前写入:

hello

world

for line in io.lines("test_data.lua") do

print(line)

end

结果为我们刚刚写入的内容。

对于lua文件I/O操作大体上就这些内容,如果有疑问的同学可以私密我。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值