问题描述
我正在尝试使用 lua 制作一个 discord 机器人,并且到目前为止进展顺利,但是我在 lua 的 IO 部分遇到了一些问题。 我试图在 lua 中读取一个大的 list.txt 文件并将每一行插入到一个表中,但到目前为止我所有的尝试都没有奏效。 有什么建议吗?
尝试 #1 吐出 nil:
local open = io.open
local function read_file(path)
local file = open(path,"r") -- r read mode and b binary mode
if not file then return nil end
local content = file:read "*a" -- *a or *all reads the whole file
file:close()
return content
end
local fileContent = read_file("list.txt")
local vga_files = {}
table.insert(vga_files,fileContent)
解决方法
我无法复制您运行代码的错误。您的代码是有效的,并且很可能按照您的要求执行。
在这里告诉 read_file
函数返回 nil
:
if not file then return nil end
因此,如果未找到 file
,您将获得 nil
。调试的一个很好的步骤是在这个 if 语句的主体中添加一个打印,看看它是否被输入。
当您调用 read_file
时:
local fileContent = read_file("list.txt")
你只传入一个文件名,这意味着 lua 会在代码执行的任何地方寻找它,这个位置可能与你期望的不同。
我通过将读取指向自身并打印结果来验证您的代码是否有效。
local open = io.open
local function read_file(path)
local file = open(path,"r") -- r read mode and b binary mode
if not file then return nil end
local content = file:read "*a" -- *a or *all reads the whole file
file:close()
return content
end
print(read_file("so_io_read_test.lua"))
此外,为了获得您应该真正使用的行,io.lines
创建了一个迭代器,您可以在 for 循环中使用该迭代器。
local vga_files = {}
for line in io.lines("list.txt") do
table.insert(vga_files,line)
end
或者,您可以读取文件,然后使用 gmatch 拆分行。
local contents = read_file("so_io_read_test.lua")
for line in contents:gmatch("([^\n]+)") do
table.insert(vga_files,line)
end