Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何使用io.read()读取特定行_File_Io_Lua - Fatal编程技术网

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()。如果行的长度不同,您很可能运气不好。如果您能给我们两个或三个示例文件,我们可能会告诉您是否可以计算位置。我确实没有以字节为单位的总位置。谢谢您的帮助。这就解决了问题