这就是我想要做的事情:
io.open("__Equivalent-Exchange__/config/EMCfixed.lua", "r")
var1 = io.read(,*n)
现在我希望能够设置用io.open
指定的文件行。发现的是:
使用文件名调用时,它会打开命名文件(在文本模式下),并将其句柄设置为默认输入文件。使用文件句柄调用时,它只是将此文件句柄设置为默认输入文件。当不带参数调用时,它返回当前的默认输入文件。
那对我没有帮助,所以我找到了io.lines
篇。
以读取模式打开给定的文件名,并在打开的文件上返回一个与
file:lines(···)
类似的迭代器函数。当迭代器函数检测到文件结束时,它不返回任何值(完成循环)并自动关闭文件。调用
io.lines()
(没有文件名)等同于io.input():lines("*l")
,即迭代默认输入文件的行。在这种情况下,它不会在循环结束时关闭文件。"
但是,我如何指定要读取的行?
P.S。关于我发现this page主题的其他信息,我对此并不了解。但它可能会帮助你帮助我。
答案 0 :(得分:3)
您无法直接跳转到指定的行,因为这需要您知道该行的位置。如果没有读取整个文件至少这一点,这只有在行具有固定长度时才可能(在这种情况下,您可以使用file:seek)。但是,如果你没有固定长度的行,你将不得不迭代这些行,按照你的计算:
function getNthLine(fileName, n)
local f = io.open(fileName, "r")
local count = 1
for line in f:lines() do
if count == n then
f:close()
return line
end
count = count + 1
end
f:close()
error("Not enough lines in file!")
end
编辑:请注意,如果要搜索同一文件的多行,则不应使用此功能(例如,您需要第3,5和8行)。在这种情况下,上面的函数会打开文件三次 - 这是浪费系统资源。相反,您可以定义要在每个数字上调用的函数,并检查其中的匹配行号:
function checkLine(lineNumber, lineContent)
-- Disregard odd line numbers
if lineNumber % 2 == 0 then
-- do something with lineContent
end
end
local f = io.open(fileName, "r")
local count = 1
for line in f:lines() do
checkLine(count, line)
end
f:close()