5.7 Ein- und Ausgabe Korrektur einreichen Original anzeigen

Die I/O-Bibliothek stellt zwei verschiedene Arten der Dateiverarbeitung zur Verfügung. Die erste nutzt implizite Dateideskriptoren; d. h. es gibt Operationen, um eine standardmäßige Ein- und Ausgabedatei zu setzen und alle Ein-/Ausgabeoperationen beziehen sich auf diese Standard-Dateien. Die zweite Art nutzt explizite Dateideskriptoren.

Bei der Verwendung impliziter Dateideskriptoren werden alle Operationen durch die Tabelle io angeboten. Bei der Verwendung expliziter Dateideskriptoren liefert die Operation io.open einen Dateideskriptor und alle Operationen werden als dessen Methoden angeboten.

Die Tabelle io stellt außerdem drei vordefinierte Dateideskriptoren mit deren gewöhnlichen Bedeutung aus C zur Verfügung: io.stdin, io.stdout und io.stderr. Die I/O-Bibliothek schließt diese Dateien niemals.

Sofern nicht anders angegeben, liefert alle I/O-Funktionen im Falle eines Fehlers nil (und eine Fehlernachricht als zweites Ergebnis und einen systemabhängigen Fehlercode als drittes Ergebnis) und einen von nil verschiedenen Wert im Erfolgsfall.

io.close([file])

Äquivalent zu file:close(). Ohne file wird die Standard-Ausgabedatei geschlossen.

io.flush()

Äquivalent zu file:flush für die Standard-Ausgabedatei.

io.input([file])

Wenn diese Funktion mit einem Dateinamen aufgerufen wird, öffnet sie die angegebene Datei (im Textmodus) und setzt dessen Handle als Standard-Eingabedatei. Wenn diese Funktion mit einem Datei-Handle aufgerufen wird, setzt sie dieses als Standard-Eingabedatei. Bei einem Aufruf ohne Parameter liefert sie die gegenwärtige Standard-Eingabedatei.

Im Falle eines Fehlers wirft diese Funktion diesen, anstatt einen Fehlercode zu liefern.

io.lines([filename])

Öffnet den angegebenen Dateinamen im Lesemodus und liefert einen Iterator, welcher bei jedem Aufruf eine neue Zeile der Datei liefert. Insofern wird eine Konstruktion wie …

for line in io.lines(filename) do body end

… über alle Zeilen der Datei iterieren. Sobald der Iterator das Ende der Datei erkennt, liefert er nil (um die Schleife zu beenden) und schließt die Datei automatisch.

Der Aufruf io.lines() (ohne Dateiname) ist äquivalent zu io.input():lines(); d. h. er iteriert über die Zeilen der Standard-Eingabedatei. In diesem Fall wird die Datei nach Beendigung der Schleife nicht geschlossen.

io.open(filename[,mode])

Diese Funktion öffnet eine Datei im mit der Zeichenkette mode angegebenen Modus. Sie liefert ein neues Datei-Handle, oder – im Falle eines Fehlers – nil und eine Fehlernachricht.

Die mode-Zeichenkette kann eine der folgenden sein:

  • "r": lesen (Standard)
  • "w": schreiben
  • "a": anhängen
  • "r+": aktualisieren; alle vorherigen Daten bleiben erhalten
  • "w+": aktualisieren; alle vorherigen Daten gehen verloren
  • "a+": anhängen + aktualisieren; vorherige Daten bleiben erhalten und Schreiben ist nur am Ende der Datei möglich

Die mode-Zeichenkette kann auch ein 'b' am Ende haben, was unter manchen Systemen benötigt wird, um die Datei im Binärmodus zu öffnen. Diese Zeichenkette ist exakt die selbe, welche in der standardmäßigen C-Funktion fopen verwendet wird.

io.output([file])

Ähnlich wie io.input, arbeitet jedoch auf der Standard-Ausgabedatei.

io.popen(prog[,mode])

Öffnet das Programm prog in einem separaten Prozess und liefert ein Datei-Handle, welches Sie verwenden können, um Daten von diesem Programm zu lesen (wenn mode "r" ist; Standard) oder um Daten zu schreiben (wenn mode "w" ist).

Diese Funktion ist systemabhängig und nicht unter allen Plattformen verfügbar.

io.read(···)

Äquivalent zu io.input():read.

io.tmpfile()

Liefert ein Handle für eine temporäre Datei. Die Datei wird im Aktualisierungsmodus geöffnet und automatisch entfernt, wenn das Programm endet.

io.type(obj)

Prüft, ob obj ein gültiges Datei-Handle ist. Liefert die Zeichenkette "file", wenn obj ein offenes Datei-Handle ist, "closed file", wenn obj ein geschlossenes Datei-Handle ist, oder nil, wenn obj kein Datei-Handle ist.

io.write(···)

Äquivalent zu io.output():write.

file:close()

Schließt file. Beachen Sie, dass Dateien automatisch geschlossen werden, wenn deren Handles von der automatischen Speicherbereinigung gesammelt werden, was jedoch eine unbestimmte Zeit dauern kann.

file:flush()

Speichert jegliche geschriebenen Datei für file.

file:lines()

Liefert einen Iterator, welcher bei jedem Aufruf eine neue Zeile der Datei liefert. Somit wird eine Konstruktion wie …

for line in file:lines() do body end

… über alle Zeilen der Datei iterieren. (Im Gegensatz zu io.lines schließt diese Funktion die Datei nach Beendigung der Schleife nicht.

file:read(···)

Liest die Datei file im angegebenen Format, welches spezifiziert, was gelesen werden soll. Diese Funktion liefert für jedes Format eine Zeichenkette (oder Nummer) mit den gelesenen Zeichen oder nil, wenn keine Daten im angegebenen Format gelesen werden konnten. Bei einem Aufruf ohne Formate wird ein Standardformat verwendet, welches die komplette nächste Zeile liest (s. u.).

Die verfügbaren Formate lauten wie folgt:

  • "*n": Nummer lesen; dies ist das einzige Format, welches eine Zahl anstatt einer Zeichenkette liefert
  • "*a": Liest die komplette Datei, beginnend bei der aktuellen Position. Am Ende jeder Datei liefert es die leere Zeichenkette.
  • "*l": Liest die nächste Zeile (unter Überspringen des Zeilenendes) und liefert nil am Ende der Datei. Dies ist das Standardformat.
  • Nummer: Liest eine Zeichenkette bis zu dieser Anzahl von Zeichen und liefert nil am Ende der Datei. Wenn die Zahl 0 ist, wird nichts gelesen und die leere Zeichenkette zurückgeliefert, oder nil am Ende der Datei.
file:seek([whence][,offset])

Setzt und liefert die Position des Dateizeigers, gemessen vom Anfang der Datei bis zur durch offset gegebenen Position und einer durch die Zeichenkette whence spezifizierten Basis:

  • "set": Basis ist Position 0 (Anfang der Datei)
  • "cur": Basis ist aktuelle Position
  • "end": Basis ist Ende der Datei

Im Erfolgsfall liefert die Funktion seek die finale Position des Dateizeigers, gemessen in Byte vom Beginn der Datei. Falls diese Funktion fehlschlägt, liefert sie nil und eine den Fehler beschreibende Zeichenkette.

Der Standardwert für whence ist "cur" und für offset 0. Somit liefert der Aufruf file:seek() die aktuelle Position des Dateizeigers ohne diese zu ändern; der Aufruf file:seek("set") setzt die Position auf den Anfang der Datei (und liefert 0); der Aufruf file:seek("end") setzt schließlich die Position an das Ende der Datei und liefert deren Größe.

file:setvbuf(mode[,size])

Setzt den Puffermodus für eine Ausgabedatei. Es sind drei Modi verfügbar:

  • "no": keine Pufferung; das Ergebnis jeder Ausgabe-Operation erscheint sofort
  • "full": volle Pufferung; Ausgabeoperationen werden nur durchgeführt, wenn der Puffer voll ist (oder wenn Sie explizit flush auf die Datei anwenden (s. io.flush))
  • "line": Zeilenpufferung; Ausgabe wird gepuffert, bis ein Zeilenumbruch oder eine Eingabe aus einer speziellen Datei (z. B. ein Terminal) erfolgt

In den letzten beiden Fällen spezifiziert size die Puffergröße (in Byte). Der Standard ist eine angemessene Größe.

file:write(···)

Schreibt den Wertes jedes Arguments in file. Die Argumente müssen Zeichenketten oder Zahlen sein. Um andere Werte zu schreiben, verwenden Sie tostring oder string.format vor write.