lua loadfile加载中文路径 lua怎么打开文件_文件句柄


文章目录

  • 一、文件 I/O
  • 二、简单模式
  • 1. io.lines([filename])
  • 三、完全模式
  • 1. file:lines()


一、文件 I/O

Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。

  • 简单模式(simple model):拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。
  • 完全模式(complete model) :使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。

打开文件操作语句如下:

file = io.open(filename [, mode])

【mode】:

lua loadfile加载中文路径 lua怎么打开文件_开发语言_02


二、简单模式

简单模式使用标准的 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()参数:

lua loadfile加载中文路径 lua怎么打开文件_lua_03


代码演示:

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