【问题标题】:How to read specific line using io.read()如何使用 io.read() 读取特定行
【发布时间】:2015-08-09 18:59:22
【问题描述】:

这就是我想要做的:

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"),也就是说,它遍历默认输入文件的行。在这种情况下,循环结束时它不会关闭文件。”

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

附:对于我找到this page的主题的其他信息,我不明白。但它可能会帮助你在帮助我的过程中。

【问题讨论】:

  • io.read('*n') 等价于io.input():read('*n')io.input() 只返回当前输入文件句柄,默认等于io.stdin
  • @EgorSkriptunoff 我真的不知道你的意思,你能试着改写它以适应@YUHao 所做的编辑吗?

标签: file io lua


【解决方案1】:

您不能直接跳转到指定的行,因为这需要您知道该行在哪里。至少到此为止,如果不读取整个文件,这只有在行具有固定长度的情况下才有可能(在这种情况下,您可以使用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 行),则不应使用此功能。在这种情况下,上面的函数会打开文件 3 次,这是对系统资源的浪费。相反,您可以定义一个对每个数字调用的函数并在那里检查匹配的行号:

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

【讨论】:

  • 谢谢,虽然我已经让程序使文件因此确切地知道哪一行是什么信息。那么有可能吗?
  • 正如我所说,只有知道确切位置(以字节为单位)才有可能。如果您碰巧只写了具有完全相同字节数的行,您可以计算位置并将其传递给 file:seek()。如果线条的长度不同,那么您很可能不走运。如果您能给我们两三个示例文件,我们也许可以告诉您是否可以计算位置。
  • 我确实没有字节总数。谢谢您的帮助。这解决了它
猜你喜欢
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多