如何使用io.read()

时间:2015-08-09 18:59:23

标签: file io lua

这就是我想要做的事情:

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

现在我希望能够设置用io.open指定的文件行。发现的是:

The reference manual州:

  

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

那对我没有帮助,所以我找到了io.lines篇。

  

以读取模式打开给定的文件名,并在打开的文件上返回一个与file:lines(···)类似的迭代器函数。当迭代器函数检测到文件结束时,它不返回任何值(完成循环)并自动关闭文件。

     

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

但是,我如何指定要读取的行?

P.S。关于我发现this page主题的其他信息,我对此并不了解。但它可能会帮助你帮助我。

1 个答案:

答案 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()