如何使用 io.read() 读取特定行?

这是我想实现的:

io.open("__Equivalent-Exchange__/config/EMCfixed.lua", "r")
var1 = io.read(,*n)

现在我想能够设置指定文件的行。我发现的是以下信息:

参考手册指出:

当用文件名调用时,它打开指定的文件(以文本模式),并将其句柄设为默认输入文件。 当使用文件句柄调用时,它只是将此文件句柄设置为默认输入文件。 在不带参数的情况下调用时,它返回当前默认输入文件。

这没有帮助我,所以我找到了 io.lines 代码:

以读取模式打开给定的文件名,并返回一个迭代器功能,它的工作方式类似于 file: lines(···) 可以打开的文件。 当迭代器函数检测到文件结尾时,它不返回任何值(以结束循环)并自动关闭文件。

调用 io.lines()(没有文件名)等同于io.input(): lines(“* l”)即,它迭代默认输入文件的行。 在这种情况下,当循环结束时,它不会关闭文件。"

但是,我怎么能指定要读取的行呢?

附:对于该话题的其他信息,我发现了此页面,但我没有理解它。 但它可能会在您帮助我的过程中提供帮助。

点赞
用户570336
用户570336

你不能直接跳到指定行,因为那需要你 知道 那一行在哪。如果不读取整个文件,至少到这一点,只有当行有固定长度时才可能实现(这种情况下,您可以使用 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)
    -- 忽略奇数行号
    if lineNumber % 2 == 0 then
        -- 对 lineContent 进行处理
    end
end

local f = io.open(fileName, "r")
local count = 1

for line in f:lines() do
    checkLine(count, line)
end

f:close()
2015-08-10 14:43:09