Lua - 文件 I/O



I/O 库用于在 Lua 中读取和操作文件。Lua 中有两种文件操作,即隐式文件描述符和显式文件描述符。

对于以下示例,我们将使用如下所示的示例文件 test.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+"

启用读模式的追加模式,打开现有文件或创建新文件。

隐式文件描述符

隐式文件描述符使用标准输入/输出模式或使用单个输入和单个输出文件。使用隐式文件描述符的示例如下所示。

main.lua

-- 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 文件中语句的第一行。此外," -- End of the test.lua file" 将追加到 test.lua 代码的最后一行。

在上面的示例中,您可以看到隐式描述符如何使用 io."x" 方法与文件系统交互。上面的示例使用 io.read() 而不带可选参数。可选参数可以是以下任何一个。

序号 模式及描述
1

"*n"

从当前文件位置读取,如果文件位置存在数字则返回该数字,否则返回 nil。

2

"*a"

从当前文件位置返回文件的全部内容。

3

"*l"

从当前文件位置读取行,并将文件位置移动到下一行。

4

数字

读取函数中指定的字节数。

其他常见的 I/O 方法包括:

  • io.tmpfile() - 返回一个临时文件,用于读取和写入,程序退出后将被删除。

  • io.type(file) - 根据输入文件返回文件、已关闭文件或 nil。

  • io.flush() - 清除默认输出缓冲区。

  • io.lines(可选文件名) - 提供一个通用的 for 循环迭代器,循环遍历文件并在最后关闭文件,如果提供了文件名或使用了默认文件并且在循环结束时未关闭。

显式文件描述符

我们经常使用显式文件描述符,它允许我们同时操作多个文件。这些函数与隐式文件描述符非常相似。在这里,我们使用 file:function_name 代替 io.function_name。以下示例显示了与相同隐式文件描述符示例相同的文件版本。

main.lua

-- 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(可选的 whence,可选的 offset) - Whence 参数是 "set"、"cur" 或 "end"。使用从文件开头更新的文件位置设置新的文件指针。此函数中的偏移量为零基。如果第一个参数为 "set",则偏移量从文件开头测量;如果为 "cur",则从文件中的当前位置测量;如果为 "end",则从文件末尾测量。默认参数值为 "cur" 和 0,因此可以通过不带参数地调用此函数来获取当前文件位置。

  • file:flush() - 清除默认输出缓冲区。

  • io.lines(可选文件名) - 提供一个通用的 for 循环迭代器,循环遍历文件并在最后关闭文件,如果提供了文件名或使用了默认文件并且在循环结束时未关闭。

使用 seek 方法的示例如下所示。它将光标从文件末尾之前的 25 个位置偏移。read 函数打印从 seek 位置开始的文件的其余部分。

main.lua

-- Opens a file in read
file = io.open("test.lua", "r")

file:seek("end",-5)
print(file:read("*a"))

-- closes the opened file
file:close()

输出

您将获得一些类似于以下内容的输出。

--test

您可以尝试所有不同的模式和参数,以了解 Lua 文件操作的全部功能。

广告