File 如何使用io.read()读取特定行
这就是我想做的:File 如何使用io.read()读取特定行,file,io,lua,File,Io,Lua,这就是我想做的: io.open("__Equivalent-Exchange__/config/EMCfixed.lua", "r") var1 = io.read(,*n) 现在,我希望能够设置用io.open指定的文件行。发现的是: 声明: 使用文件名调用时,将打开命名文件(以文本模式),并将其句柄设置为默认输入文件。当使用文件句柄调用时,它只是将此文件句柄设置为默认输入文件。在没有参数的情况下调用时,它返回当前默认输入文件 这对我没有帮助,所以我
io.open("__Equivalent-Exchange__/config/EMCfixed.lua", "r")
var1 = io.read(,*n)
现在,我希望能够设置用io.open
指定的文件行。发现的是:
声明:
使用文件名调用时,将打开命名文件(以文本模式),并将其句柄设置为默认输入文件。当使用文件句柄调用时,它只是将此文件句柄设置为默认输入文件。在没有参数的情况下调用时,它返回当前默认输入文件
这对我没有帮助,所以我找到了io.lines
片段:
以读取模式打开给定的文件名,并返回一个迭代器函数,该函数在打开的文件上的工作方式类似于file:lines(··)
。当迭代器函数检测到文件结束时,它不返回任何值(以完成循环),并自动关闭文件
调用io.lines()
(没有文件名)相当于io.input():lines(“*l”)
,也就是说,它迭代默认输入文件的行。在这种情况下,循环结束时不会关闭文件。”
但是,如何指定要读取的行
另外,关于我找到的主题的其他信息,我不理解。但这可能会帮助您帮助我。您不能直接跳到指定的行,因为这需要您知道该行的位置。如果不阅读整个文件,至少到目前为止,这只有在行具有固定长度的情况下才可能(在这种情况下,您可以使用)。但是,如果没有固定长度的行,则必须在这些行上进行迭代,边计算边计算:
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()
io.read('*n')
相当于io.input():read('*n')
io.input()
只返回当前输入文件句柄,默认情况下等于io.stdin
。@EgorSkriptunoff我实际上不知道I don’我不知道你的意思,你能试着重新措辞以适应@YUHao所做的编辑吗?可能是重复的谢谢,尽管我已经让程序让文件准确地知道在哪一行上有什么信息。那可能吗?正如我所说,只有你知道确切的位置(字节)才有可能。如果您碰巧只写入具有完全相同字节数的行,则可以计算位置并将其传递给file:seek()。如果行的长度不同,您很可能运气不好。如果您能给我们两个或三个示例文件,我们可能会告诉您是否可以计算位置。我确实没有以字节为单位的总位置。谢谢您的帮助。这就解决了问题