Arbeiten mit Dateien


Für ein hochwertiges Programm braucht man meist auch andere Dateien,sei es der Übersicht halber oder aus reinerFunktionalität. Aufjedenfall gibt es dafür wieder einige verschiedene Methoden. Wenn man einfach nur eine weitere Datei, die LUA-Code enthält, ins Script einbinden will, dann eignet sich "dofile" ganz gut. Dieser Befehl muss dann an gewünschter Stelle eingebunden werden:

	dofile ("hallo.lua")
	

...bei mir könnte ich z.B. in meiner script.lua auf die Datei"hallo.lua", die sich im selben Ordner befindet, zugreifen. In "hallo.lua" könnten dann z.B Funktionen enthalten sein. Da dofile aber etwas "buggy" ist, also auch zu Programmabstürzen führen kann, bevorzuge ich diese Methode:

	datei = loadFile("hallo.txt")
	datei()

...dieser kleine Codeblock ist stabiler als "dofile". Mit loadFile() lade ich erst eine Datei und erstelle dabei eine Art Funktion, die ich sofort danach mit "datei()" ausführe. Die eleganteste Methode meiner Meinung nach ist allerdings folgende:

	require "datei"

Damit wird eine .lua Datei namens "datei" ins Script miteingebunden. Wichtig ist dabei, dass das nur mit .lua-Dateien oder mit so genannten Libraries funktioniert und dabei die Dateiendung nicht mitangegeben werden darf.

Mit diesen Methoden kann ich also Dateien einlesen, aber nur mit funktionierenden, fehlerfreien LUA-Code. Wenn man jetzt selber Dateien erstellen will oder bestimmte Dateiformate mit genauer Zeile auslesen will, gibt es folgende Methode:

	datei = io.open("huhu.txt", "r")
	zeile = datei:read()
	datei:close()

...hierbei wird die erste Zeile der Datei "huhu.txt" gelesen. Beim nächsten "datei:read()" wird die folgende Zeile gelesen usw. Für "datei:read()" gibt es aber auch Parameter (Werte) für innerhalb der Klammer, die wie folgt aussehen:

	*n - Liest eine Zahl ein. Bsp.: datei:read("*n")
	*a - Liest die ganze Datei ab der Momentanen Position, bsp.: datei:read("*a")
	*l - Liest die nächste Zeile, ist standardmäßig auch ohne Parameter eingestellt., bsp.: datei:read("*l")
	zahl - Liest eine Zeichenkette mit der angegebenen Zeichzahl ein, bsp.: datei:read(5)
	

Jetzt kann man Dateien aber nicht nur lesen, sondern auch schreiben. Dazu vorweg eine kleine Liste mit den dazugehörigen "Commands". Wer sich vorher gefragt hat, was das "r" in der Klammer von io.open soll, erfährt es jetzt:

	r - Lesemodus (read mode)
	w - Schreibmodus, überschreibt kompletten Inhalt (write mode)
	a - Fügt zum existierenden Inhalt hinzu (append mode)
	b - Binärmodus (binary mode)
	r+ - Updatemodus (existierende Daten bleiben)
	w+ - Updatemodus(existierende Daten bleiben)
	a+ - Zufüg -und Updatemodus (existierende Daten bleiben, fügt nur am Ende hinzu)
	

Wie kann man dann etwas in eine Datei schreiben?

	datei = io.open("huhu.txt","w")
	datei:write("hallo")
	datei:close()
	

Zuguterletzt noch eine kleine Funktion von mir, mit der man alle Zeilen einer Datei auslesen kann. Die Werte werden in einerTable gespeichert:

	function readAllLines(datei)
		zeilen = {}
		datei = io.open(datei,"r")
		for line in datei:lines() do
			zeilen[line] = line
		end
		datei:close()
	end
	

Wer alle Zeilen auslesen will und dann noch gleich anzeigen lassen will kann das mit dieser Funktion machen:

	function printAllLines(datei,color)
		y=10
		zeilen = {}
		datei = io.open(datei,"r")
		for line in datei:lines() do
			zeilen[line] = liney=y+10
			screen:print(0,y,zeilen[line],color)
		end
		datei:close()
	end
	

Zu beachten ist hier besonders, dass die Filehandling-Methoden nicht generell io.open / io.close etc. sind. Die Befehle sind auch abhängig vom jeweiligen Luaplayer.