Lua-Datei-E/A

Die Lua-E/A-Bibliothek wird zum Lesen und Verarbeiten von Dateien verwendet. Sie ist in einen einfachen Modus (wie in C) und einen vollständigen Modus unterteilt.

  • Das einfache Modell verfügt über eine aktuelle Eingabedatei und eine aktuelle Ausgabedatei und stellt Operationen für diese Dateien bereit.
  • Das vollständige Modell verwendet externe Dateihandles für die Implementierung. In objektorientierter Form definiert es alle Dateioperationen als Methoden des Dateihandles.

Der einfache Modus eignet sich besser für einige einfache Dateioperationen. Bei einigen fortgeschrittenen Dateioperationen scheint der einfache Modus jedoch unzureichend zu sein. Zum Beispiel eignet sich der vollständige Modus besser für Vorgänge wie das gleichzeitige Lesen mehrerer Dateien.

Die Anweisung zum Öffnen einer Datei lautet wie folgt:

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

Die Werte von mode sind:

ModeBeschreibung
rÖffnet die Datei im Nur-Lese-Modus; die Datei muss vorhanden sein.
wÖffnet eine Datei nur zum Schreiben. Wenn die Datei vorhanden ist, wird ihre Länge auf 0 gesetzt, das heißt, ihr Inhalt verschwindet. Wenn die Datei nicht vorhanden ist, wird sie erstellt.
aÖffnet eine Datei nur zum Schreiben im Anhängemodus. Wenn die Datei nicht existiert, wird sie erstellt. Wenn die Datei existiert, werden geschriebene Daten an das Ende der Datei angehängt, d. h. der ursprüngliche Inhalt der Datei bleibt erhalten. (EOF-Marker bleibt erhalten)
r+ Öffnet die Datei zum Lesen und Schreiben; die Datei muss existieren.
w+ Öffnet eine Datei zum Lesen und Schreiben. Wenn die Datei existiert, wird ihre Länge auf null gesetzt, d. h. ihr Inhalt verschwindet. Wenn die Datei nicht existiert, wird sie erstellt.
a+ Ähnlich wie a, aber diese Datei ist lesbar und schreibbar.
b Binärmodus. Wenn die Datei eine Binärdatei ist, kannst du b hinzufügen.
+ Das +-Zeichen zeigt an, dass die Datei sowohl gelesen als auch geschrieben werden kann.

Einfacher Modus

Der einfache Modus verwendet Standard-I/O oder eine aktuelle Eingabedatei und eine aktuelle Ausgabedatei.

Das Folgende ist der Code der Datei file.lua. Die Datei, die bearbeitet wird, ist test.lua (falls sie nicht existiert, musst du sie erstellen). Der Code lautet wie folgt:

Beispiel

-- Die Datei im Nur-Lese-Modus öffnen
file = io.open("test.lua", "r")

-- Die Standard-Eingabedatei auf test.lua setzen
io.input(file)

-- Gib die erste Zeile der Datei aus
print(io.read())

-- Die geöffnete Datei schließen
io.close(file)

-- Öffne eine nur beschreibbare Datei im Anhängemodus
file = io.open("test.lua", "a")

-- Setze die Standard-Ausgabedatei auf test.lua
io.output(file)

-- Füge einen Lua-Kommentar zur letzten Zeile der Datei hinzu
io.write("-- test.lua Kommentar am Dateiende")

-- Die geöffnete Datei schließen
io.close(file)

Nach dem Ausführen des obigen Codes werden Sie feststellen, dass er die Informationen der ersten Zeile der Datei test.lua ausgibt und einen Lua-Kommentar zur letzten Zeile der Datei hinzufügt. Zum Beispiel ist meine Ausgabe hier:

-- test.lua 文件

Im obigen Beispiel haben wir die Methode io."x" verwendet. In io.read() haben wir keinen Parameter übergeben. Der Parameter kann einer der folgenden in der Tabelle sein:

ModeBeschreibung
"*n"Liest eine Zahl und gibt sie zurück. Beispiel: file.read("*n")
"*a"Liest die gesamte Datei ab der aktuellen Position. Beispiel: file.read("*a")
"*l" (Standard)Liest die nächste Zeile; gibt bei EOF nil zurück. Beispiel: file.read("*l")
numberGibt einen String mit der angegebenen Anzahl von Zeichen zurück oder gibt bei EOF nil zurück. Beispiel: file.read(5)

Weitere io-Methoden sind:

  • io.tmpfile():Gibt ein temporäres Dateihandle zurück. Die Datei wird im Update-Modus geöffnet und automatisch gelöscht, wenn das Programm endet.

  • io.type(file):Prüft, ob obj ein verwendbares Dateihandle ist.

  • io.flush():Schreibt alle gepufferten Daten in die Datei.

  • io.lines(optionaler Dateiname):Gibt eine Iteratorfunktion zurück. Jeder Aufruf liest eine Zeile aus der Datei. Bei EOF gibt sie nil zurück, schließt die Datei aber nicht.


Vollständiger Modus

Normalerweise müssen wir mehrere Dateien gleichzeitig verarbeiten. Wir müssen file:function_name anstelle der Methoden io.function_name verwenden. Das folgende Beispiel zeigt, wie man dieselbe Datei gleichzeitig verarbeitet:

Beispiel

-- Die Datei im Nur-Lese-Modus öffnen
file = io.open("test.lua", "r")

-- Gib die erste Zeile der Datei aus
print(file:read())

-- Die geöffnete Datei schließen
file:close()

-- Öffne eine nur beschreibbare Datei im Anhängemodus
file = io.open("test.lua", "a")

-- Füge einen Lua-Kommentar zur letzten Zeile der Datei hinzu
file:write("--test")

-- Die geöffnete Datei schließen
file:close()

Nach dem Ausführen des obigen Codes werden Sie feststellen, dass er die Informationen der ersten Zeile der Datei test.lua ausgibt und einen Lua-Kommentar zur letzten Zeile der Datei hinzufügt. Zum Beispiel ist meine Ausgabe hier:

-- test.lua 文件

Die Parameter von read sind dieselben wie im einfachen Modus.

Weitere Methoden:

  • file:seek(optional whence, optional offset):Setzt und ermittelt die aktuelle Dateiposition. Bei Erfolg wird die endgültige Dateiposition (in Bytes) zurückgegeben; bei Fehler wird nil plus eine Fehlermeldung zurückgegeben. Der Parameter whence kann folgende Werte annehmen:

    • "set": beginnt am Anfang der Datei
    • "cur": beginnt an der aktuellen Position [Standard]
    • "end": beginnt am Ende der Datei
    • offset: Standard ist 0
    Ohne Parameter gibt file:seek() die aktuelle Position zurück; file:seek("set") positioniert an den Anfang der Datei; file:seek("end") positioniert an das Ende der Datei und gibt die Dateigröße zurück.
  • file:flush():Schreibt alle gepufferten Daten in die Datei.

  • io.lines(optionaler Dateiname):Öffnet die angegebene Datei filename im Lesemodus und gibt eine Iteratorfunktion zurück. Jeder Aufruf ruft eine Zeile aus der Datei ab. Beim Erreichen von EOF gibt sie nil zurück und schließt die Datei automatisch.
    Wenn ohne Parameter aufgerufen, gilt io.lines() <=> io.input():lines(); es liest den Inhalt des Standardeingabegeräts, schließt die Datei am Ende jedoch nicht, zum Beispiel:

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

Das folgende Beispiel verwendet die Methode seek, um an die 25. Position vom Ende der Datei zu positionieren, und verwendet den Parameter *a der Methode read, d. h. liest die gesamte Datei ab der aktuellen Position (der 25. Position vom Ende).

Beispiel

-- Die Datei im Nur-Lese-Modus öffnen
file = io.open("test.lua", "r")

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

-- Die geöffnete Datei schließen
file:close()

Meine Ausgabe hier ist:

st.lua 文件末尾--test
Andere Erweiterungen