如何在lua中将文件行插入表格

我正在尝试使用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)
点赞
用户7396148
用户7396148

我试图运行你的代码,但无法重现你的错误。你的代码是有效的,并且可能正在执行你要求它执行的操作。

在这里,你告诉read_file函数返回nil

if not file then return nil end

所以,如果找不到file,你将得到nil。在调试时,一个好的步骤是在这个if语句的主体中添加一个print语句,看看是否进入其中。

当你调用read_file时:

local fileContent = read_file("list.txt")

你只传入了一个文件名,这意味着Lua将在执行代码的任何位置寻找它,而这个位置可能与你预期的不同。

我通过将读取指向自身并打印结果来验证你的代码。

local open = io.open
local function read_file(path)
    local file = open(path, "r") -- r读取模式和b二进制模式
    if not file then return nil end
    local content = file:read "*a" -- * a或* all读取整个文件
    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
2020-12-30 17:59:08