如果一个多年没联系的同学突然发微信给你,只有以下三种情况: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操作大体上就这些内容,如果有疑问的同学可以私密我。