Lua - 文件 I/O

  • 简述

    I/O 库用于在 Lua 中读取和操作文件。Lua 中有两种文件操作,即隐式文件描述符和显式文件描述符。
    对于以下示例,我们将使用示例文件 test.lua,如下所示。
    
    -- sample test.lua
    -- sample2 test.lua
    
    一个简单的文件打开操作使用以下语句。
    
    file = io.open (filename [, mode])
    
    下表列出了各种文件模式。
    序号 模式和描述
    1
    "r"
    只读模式,是打开现有文件的默认模式。
    2
    "w"
    写入启用模式覆盖现有文件或创建新文件。
    3
    "a"
    打开现有文件或创建新文件以进行追加的追加模式。
    4
    "r+"
    现有文件的读写模式。
    5
    "w+"
    如果文件存在或创建具有读写权限的新文件,则删除所有现有数据。
    6
    "a+"
    启用读取模式的追加模式可打开现有文件或创建新文件。
  • 隐式文件描述符

    隐式文件描述符使用标准输入/输出模式或使用单个输入和单个输出文件。下面显示了使用隐式文件描述符的示例。
    
    -- Opens a file in read
    file = io.open("test.lua", "r")
    -- sets the default input file as test.lua
    io.input(file)
    -- prints the first line of the file
    print(io.read())
    -- closes the open file
    io.close(file)
    -- Opens a file in append mode
    file = io.open("test.lua", "a")
    -- sets the default output file as test.lua
    io.output(file)
    -- appends a word test to the last line of the file
    io.write("-- End of the test.lua file")
    -- closes the open file
    io.close(file)
    
    当你运行程序时,你会得到 test.lua 文件第一行的输出。对于我们的程序,我们得到了以下输出。
    
    -- Sample test.lua
    
    这是我们 test.lua 文件中语句的第一行。此外,“--Test.lua 文件的结尾”行将附加到 test.lua 代码的最后一行。
    在上面的示例中,您可以看到隐式描述符如何使用 io."x" 方法与文件系统一起工作。上面的例子使用 io.read() 没有可选参数。可选参数可以是以下任何一个。
    序号 模式和描述
    1
    "*n"
    从当前文件位置读取,如果文件位置存在则返回一个数字或返回 nil。
    2
    "*a"
    从当前文件位置返回文件的所有内容。
    3
    "*l"
    从当前文件位置读取行,并将文件位置移动到下一行。
    4
    number
    读取函数中指定的字节数。
    其他常见的 I/O 方法包括,
    • io.tmpfile() - 返回一个用于读写的临时文件,一旦程序退出,该文件将被删除。
    • io.type(file) − 根据输入文件返回文件、关闭文件或零。
    • io.flush() − 清除默认输出缓冲区。
    • io.lines(optional file name)- 提供通用的for循环迭代器,循环遍历文件并在最后关闭文件,以防提供文件名或使用默认文件但在循环结束时未关闭。
  • 显式文件描述符

    我们经常使用显式文件描述符,它允许我们一次操作多个文件。这些函数与隐式文件描述符非常相似。在这里,我们使用 file:function_name 而不是 io.function_name。下面显示了相同隐式文件描述符示例的文件版本示例。
    
    -- Opens a file in read mode
    file = io.open("test.lua", "r")
    -- prints the first line of the file
    print(file:read())
    -- closes the opened file
    file:close()
    -- Opens a file in append mode
    file = io.open("test.lua", "a")
    -- appends a word test to the last line of the file
    file:write("--test")
    -- closes the open file
    file:close()
    
    当您运行该程序时,您将获得与隐式描述符示例类似的输出。
    
    -- Sample test.lua
    
    外部描述符的所有文件打开和参数读取方式与隐式文件描述符相同。
    其他常见的文件方法包括,
    • file:seek(optional whence, optional offset)− 当参数为“set”、“cur”或“end”时。使用从文件开头开始的更新文件位置设置新文件指针。此函数中的偏移量从零开始。如果第一个参数是“set”,则偏移量从文件的开头开始测量;如果它是“cur”,则从文件中的当前位置开始;或者从文件的末尾,如果它是“结束”。默认参数值为“cur”和0,因此可以通过不带参数调用此函数来获取当前文件位置。
    • file:flush() − 清除默认输出缓冲区。
    • io.lines(optional file name)- 提供通用的for循环迭代器,循环遍历文件并在最后关闭文件,以防提供文件名或使用默认文件但在循环结束时未关闭。
    下面显示了使用 seek 方法的示例。它将光标从文件末尾之前的 25 个位置偏移。read 函数从查找位置打印文件的其余部分。
    
    -- Opens a file in read
    file = io.open("test.lua", "r")
    file:seek("end",-25)
    print(file:read("*a"))
    -- closes the opened file
    file:close()
    
    您将获得一些类似于以下内容的输出。
    
    sample2 test.lua
    --test
    
    您可以使用所有不同的模式和参数来了解 Lua 文件操作的全部功能。