English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua Datei I/O

Lua I/Die O-Bibliothek wird zur Lesung und Verarbeitung von Dateien verwendet. Sie ist in den Modus einfach (wie C) und den Modus vollständig unterteilt.

  • Der einfache Modus (simple model) verfügt über eine aktuelle Eingabedatei und eine aktuelle Ausgabedatei und bietet Operationen, die für diese Dateien relevant sind.

  • Der vollständige Modus (complete model) verwendet externe DateihANDLEs zur Implementierung. Er definiert alle Dateioperationen als Methoden der DateihANDLEs in einer objektorientierten Form

Der einfache Modus ist für einfache Dateioperationen geeignet. Er zeigt jedoch seine Schwächen bei einigen fortgeschrittenen Dateioperationen, wie z.B. dem gleichzeitigen Lesen mehrerer Dateien. In diesem Fall ist der vollständige Modus geeigneter.

Die Anweisung zum Öffnen einer Datei ist wie folgt:

file = io.open (filename[, mode])

Die Werte von mode sind:

模式描述
rÖffne die Datei im Lese-Modus, die Datei muss existieren.
wÖffne die Datei im Schreibmodus. Wenn die Datei existiert, wird die Dateilänge auf Null gesetzt, d.h. der Inhalt der Datei wird gelöscht. Wenn die Datei nicht existiert, wird die Datei erstellt.
aÖffne die Datei im Anhängemodus. Wenn die Datei nicht existiert, wird die Datei erstellt, und wenn die Datei existiert, werden die geschriebenen Daten am Ende der Datei hinzugefügt, d.h. der ursprüngliche Inhalt der Datei wird beibehalten. (EOF-Zeichen wird beibehalten)
r+Öffne die Datei im Les-/Schreibmodus, die Datei muss existieren.
w+Öffne die Datei im Les-/Schreibmodus, wenn die Datei existiert, wird die Dateilänge auf Null gesetzt, d.h. der Inhalt der Datei wird gelöscht. Wenn die Datei nicht existiert, wird die Datei erstellt.
a+Ähnlich wie a, aber diese Datei ist lesbar und schreibbar
bBinärbetrieb, falls die Datei eine binäre Datei ist, kann b hinzugefügt werden
+Das Zeichen # bedeutet, dass auf die Datei sowohl gelesen als auch geschrieben werden kann

Einfacher Modus

Der einfache Modus verwendet den Standard I/O 或使用一个当前输入文件和一个当前输出文件。

以下为 file.lua 文件代码,操作的文件为 test.lua(如果没有你需要创建该文件),代码如下:

-- 以只读方式打开文件
file = io.open("test.lua", "r")
-- 设置默认输入文件为 test.lua
io.input(file)
-- 输出文件第一行
print(io.read())
-- 关闭打开的文件
io.close(file)
-- 以附加的方式打开只写文件
file = io.open("test.lua", "a")
-- 设置默认输出文件为 test.lua
io.output(file)
-- 在文件最后一行添加 Lua 注释
io.write("--  test.lua 文件末尾注释")
-- 关闭打开的文件
io.close(file)

执行以上代码,你会发现,输出了 test.lua 文件的第一行信息,并在该文件最后一行添加了 lua 的注释。如我这边输出的是:

-- test.lua 文件

在以上示例中我们使用了 io."x" 方法,其中 io.read() 中我们没有带参数,参数可以是下表中的一个:

模式描述
"*n"读取一个数字并返回它。例:file.read("*n")
"*a"从当前位置读取整个文件。例:file.read("*a")
"*l"(默认)读取下一行,在文件尾 (EOF) 处返回 nil。例:file.read("*l")
number返回一个指定字符个数的字符串,或在 EOF 时返回 nil。例:file.read(5)

其他的 io 方法有:

  • io.tmpfile():返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除

  • io.type(file): 检测 obj 是否一个可用的文件句柄

  • io.flush(): 向文件写入缓冲中的所有数据

  • io.lines(optional file name): 返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,但不关闭文件

完全模式

通常我们需要在同一时间处理多个文件。我们需要使用 file:function_name 来代替 io:function_name 方法。以下示例演示了如何同时处理同一个文件:

-- 以只读方式打开文件
file = io.open("test.lua", "r")
-- 输出文件第一行
print(file:read())
-- 关闭打开的文件
file:close()
-- 以附加的方式打开只写文件
file = io.open("test.lua", "a")
-- 在文件最后一行添加 Lua 注释
file:write("--test")
-- 关闭打开的文件
file:close()

执行以上代码,你会发现,输出了 test.ua 文件的第一行信息,并在该文件最后一行添加了 lua 的注释。如我这边输出的是:

-- test.lua 文件

read 的参数与简单模式一致。

其他方法:

  • file:seek(optional whence, optional offset): 设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息。参数 whence 值可以是:

    不带参数file:seek()则返回当前位置,file:seek("set")则定位到文件头,file:seek("end")则定位到文件尾并返回文件大小

    • "set": 从文件头开始

    • "cur": 从当前位置开始[默认]

    • "end": 从文件尾开始

    • offset:默认为0

  • file:flush(): 向文件写入缓冲中的所有数据

  • io.lines(optional file name): 打开指定的文件filename为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,并自动关闭文件。
    若不带参数时io.lines()  io.input():lines(); 读取默认输入设备的内容,但结束时不关闭文件,如:

    for line in io.lines("main.lua") do
      print(line)
      end

以下示例使用了 seek 方法,定位到文件倒数第 25 个位置并使用 read 方法的 *a 参数,即从当期位置(倒数第 25 个位置)读取整个文件。

-- 以只读方式打开文件
file = io.open("test.lua", "r")
file:seek("end",-25)
print(file:read("*a"))
-- 关闭打开的文件
file:close()

我这边输出的结果是:

st.lua 文件末尾--test