一、文件 I/O
Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。
简单模式(simple model):拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。
完全模式(complete model) :使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。
打开文件操作语句如下:
file = io.open(filename [, mode])
【mode】:
二、简单模式
简单模式使用标准的 I/O 或使用一个当前输入文件和一个当前输出文件。
file = io.open('a.txt', 'r') io.input(file) print(io.read()) -- a.txt读入第一行 io.close(file)
file = io.open('a.txt', 'r') io.output(file) io.write("lua") -- 输出定向到文件a.txt中 io.close(file)
io.read()
参数:
代码演示:
file = io.open('./a.txt', 'w') io.output(file) io.write('zzz\n') io.write('111\n') io.write('222\n') io.write('aaa\n') io.close(file) -- 保证数据写入file
a.txt:
zzz 111 222 aaa
file = io.open('./a.txt', 'r') io.input(file) print("read('*n')", io.read('*n')) io.close(file)
运行输出;
read('*n') nil
如果a.txt
文件第一行是数字开头(例:12x),那么会读完数字(输出:12)。
file = io.open('./a.txt', 'r') io.input(file) print("read('*a')", io.read('*a')) io.close(file)
运行输出:
read('*a') zzz 111 222 aaa
其他的 io 方法有:
io.tmpfile():返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除。
io.type(file):检测obj是否一个可用的文件句柄。
io.flush():向文件写入缓冲中的所有数据。
io.lines(optional file name):返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,但不关闭文件。
1. io.lines([filename])
原型:io.lines ([filename])
解释:按文件名以读的模式打开一个文件,并且返回一个迭代函数。这个迭代函数每一次被调用都会返回文件中新的一行的内容,直到文件中所有的内容都被读完。当迭代函数检测到文件末尾时,它会返回nil来结束循环并自动关闭文件。
常用形式(读取整个文件内容):
for line in file do print(line) end
自动关闭文件示例:
local file = io.lines('./a.txt') print(file()) print(file()) print(file()) print(file()) print(file()) -- nil or 空 -- 到此文件已经自动关闭 -- io.close(file) or file() 都会报错!
三、完全模式
通常我们需要在同一时间处理多个文件。我们需要使用 file:function_name 来代替 io.function_name 方法。
1. file:lines()
lines函数还有另一种表现形式:file:lines()。
如果设置了io.input(file),那么这样就等价于:io.input():lines()。
file = io.open('./a.txt') for line in file:lines() do print(line) end io.close()
file = io.open('./a.txt') io.input(file) for line in io.input():lines() do print(line) end io.close()
read 的参数与简单模式一致。
其他方法:
file:seek(optional whence, optional offset):设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息。参数【whence】:
“set”: 从文件头开始
“cur”: 从当前位置开始[默认]
“end”: 从文件尾开始
offset:默认为0
不带参数file:seek()则返回当前位置;
file:seek("set")则定位到文件头;
file:seek("end")则定位到文件尾并返回文件大小;
file:flush():向文件写入缓冲中的所有数据。
a.txt
zzz 111 222 aaa
local file = io.open('./a.txt') file:seek('end', -10) print(file:read('*a')) file:close()
运行输出:
1 222 aaa