BASIC-Tutorial (Vorwort, Installation, Kapitel 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

Dateizugriff, Schlusswort

11.1. Dateizugriff

Für manche Anwendungszwecke ist der Arbeitsspeicher zur Speicherung von Daten ungeeignet. Beispielsweise wenn Sie Daten auf längere Zeit speichern möchten. Daten, die im Arbeitsspeicher untergebracht werden, gehen spätestens verloren, wenn der Rechner ausgeschaltet wird, im Normalfall jedoch bereits nach dem Schließen des Programmes (alles andere ist auch unerwünscht; Zombie-Prozess). Ein weiteres Problem des Arbeitsspeichers ist, dass von diesem unter DOS nur ein sehr geringer Teil zur Verfügung steht (640 kB). Darum ist der Arbeitsspeicher zur Speicherung großer Datenmengen ungeeignet. Abhilfe schafft die Speicherung der Daten auf einem Datenträger (Festplatte, Diskette, etc.). Es soll an dieser Stelle nicht der Eindruck entstehen, dass die Speicherung auf einem Datenträger generell vorzuziehen ist. Der Arbeitsspeicher bietet eine weitaus höhere Geschwindigkeit als eine Festplatte (von Disketten gar nicht zu sprechen).

Ich möchte an dieser Stelle nur auf das Lesen und Schreiben von Textdateien eingehen, da sie die gängigste Möglichkeit darstellen, Daten zu speichern. Allerdings ist die Verwendungen von Textdateien nicht immer möglich. Nähere Informationen finden Sie wie immer in der Hilfedatei zu Ihrem Compiler/Interpreter. Sie sollten mit Ihrem derzeiten Wissen über BASIC in der Lage sein, aus dieser zu lernen.

Zunächst werden wir eine Textdatei schreiben. Den zu schreibenden Text können Sie selbst bestimmen. Wie das geht, zeigt das nächste Beispiel. Im übernächsten Beispiel werden Sie sehen, wie diese Textdatei wieder eingelesen werden kann.

Bevor aber aus einer Datei gelesen bzw. in eine Datei geschrieben werden kann, muss diese geöffnet (wenn gelesen werden soll oder in eine bereits vorhandene Datei geschrieben werden soll) bzw. eröffnet (erstellt; wenn in eine noch nicht vorhandene Datei geschrieben werden soll) werden. Hierfür steht der Befehl OPEN zur Verfügung. Dieser hat folgende Syntax:

OPEN Datei FOR Zugriffsmodus AS Zugriffsbezeichner

Datei bezeichnet den Dateinamen der Datei (relativer oder absoluter Pfad). Ein relativer Pfad wäre zum Beispiel datei01.txt, was bedeutet, dass diese Datei im aktuellen Verzeichnis liegt. Ein absoluter Pfad wäre zum Beispiel C:\qb\datei01.txt.

Der Zugriffsmodus gibt an, wie die Datei behandelt werden soll. Behandelt werden an dieser Stelle nur die Modi INPUT (öffnet eine Datei nur zum Lesen) und OUTPUT. OUTPUT eröffnet eine Datei bzw. öffnet eine bereits vorhandene zum Schreiben. Bereits vorhandene Dateien werden ohne Vorwarnung überschrieben!

Weiters gäbe es noch die Modi APPEND (fügt einen Text an eine vorhandene Textdatei an; nach dem Öffnen der Textdatei steht der Dateizeiger am Ende der Datei, also nach dem bisherigen Inhalt), BINARY (auf Dateien im Binärmodus zugreifen; Sie sollten sich unbedingt dazu die entsprechenden Einträge in der Hilfedatei ansehen!) und RANDOM. (Standardzugriffsmodus).

Der Zugriffsbezeichner ist im Gegensatz zu anderen Programmiersprachen kein Name (String), sondern ein numerischer Bezeichner, also eine Zahl. Üblicherweise nimmt man eine möglichst kleine Zahl, die jedoch nicht negativ sein darf. Im nächsten Beispiel wird die Datei C: ile01.txt zum Schreiben (!) geöffnet, als Zugriffsbezeichner wird 1 verwendet:

OPEN "C: ile01.txt" FOR OUTPUT AS 1

Wurde die Datei ordnungsgemäß geöffnet, kann in die Datei geschrieben werden. Das geschieht mit PRINT wie folgt:

PRINT #Zugriffsbezeichner, Text

Wäre beispielsweise der Zugriffsbezeichner 1 und möchte man den Text Dieser Text wird in eine Textdatei geschrieben in eine Datei schreiben, so ginge das folgendermaßen:

PRINT #1, "Dieser Text wird in eine Textdatei geschrieben"

Nach dem Zugriff auf die Datei (egal ob die Datei gelesen oder geschrieben wurde) muss diese geschlossen werden. Das geschieht mithilfe des Befehls CLOSE. Dessen Syntax:

CLOSE Zugriffsbezeichner

Im Beispiele wäre das:

CLOSE 1

Der nächste Quellcode fasst die eben genannten Dinge zu einem kleinen Beispiel zusammen:

CLS
OPEN "C:ile01.txt" FOR OUTPUT AS 1
PRINT "'-Ende' eingeben um das Programm zu beenden"
DO
   LINE INPUT ": ", buffer$
   IF buffer$ <> "-Ende" THEN PRINT #1, buffer$
LOOP UNTIL buffer$ = "-Ende"
CLOSE 1

In der zweiten Zeile wird die Datei file01.txt im Hauptverzeichnis der Partition/Festplatte C angelegt. Da OUTPUT angegeben wurde, wird die Datei zum Schreiben geöffnet. Als Zugriffbezeichner wurde 1 gewählt. Diese 1 repräsentiert quasi die Datei. Sie muss angegeben werden, damit auf die richtige Datei zugegriffen wird (hier ist die richtige Datei die Datei file01.txt im Verzeichnis C:\).

Der nächste interessante Teil ist die Schleife: Zunächst wird mit LINE INPUT in die Variable buffer$ ein String eingelesen. Dieser String soll später in die Datei geschrieben werden. Die IF-Anweisung überprüft, ob der Wert des Strings ungleich -Ende ist (Operator <>). Ist er das, wird der Text in die Datei geschrieben. Der Text -Ende ist Teil unserer Abbruchbedingung. Wird dieser Text eingegeben, wird das Programm beendet.

Die IF-Anweisung sorgt dafür, dass nicht auch der Text -Ende in der Datei steht. Sie haben (theoretisch) die Möglichkeit, unendlich viel Text in die Datei schreiben zu lassen. Abschließend wird die Datei ordnungsgemäß mit CLOSE geschlossen.

Nun werden wir die Datei wieder einlesen und den Inhalt der Datei ausgeben. Zunächst muss die Datei geöffnet werden. Da wir sie einlesen möchten, ist nun als Zugriffsmodus INPUT anzugeben, z.B.:

OPEN "C: ile01.txt" FOR INPUT AS 1

Nachdem die Datei geöffnet wurde, können wir sie einlesen. Wir nehmen hierzu LINE INPUT (auch mit INPUT möglich). LINE INPUT wird folgendermaßen angewandt:

LINE INPUT #Zugriffsbezeichner, Variable

LINE INPUT liest eine Zeile aus der Datei ein und speichert den eingelesenen Text in der angegebenen Variable. Die Variable muss vom Typ String sein. Beispielsweise:

LINE INPUT #1, buffer$

Wichtig ist beim zeilenweisen Einlesen von Textdateien die Funktion EOF, die dann true liefert, wenn das Dateiende erreicht ist. Die Funktion EOF erwartet als Parameter den Zugriffsbezeichner der Datei. Nach dem Einlesen muss die Datei wieder geschlossen werden. Das nächste Beispiel soll zeigen, wie die mit dem obigen Beispiel geschriebene Textdatei wieder gelesen werden kann. Der Inhalt wird auf dem Bildschirm angezeigt.

CLS
OPEN "C:ile01.txt" FOR INPUT AS 1
DO
   LINE INPUT #1, buffer$
   PRINT buffer$
LOOP UNTIL EOF(1)
CLOSE 1

Zunächst wird die Datei C: ile01.txt zum Lesen geöffnet. Als Zugriffsbezeichner/-nummer wurde wie im vorigen Beispiel 1 verwendet. Dann wird in einer Schleife die Datei zeilenweise eingelesen und der gelesene Text sofort auf dem Bildschirm angezeigt. Die Schleife wird beendet, wenn EOF true liefert. Das passiert, wenn das Dateiende erreicht ist. Zum Schluss wird die Datei geschlossen, damit auf sie wieder problemlos von anderen Programmen zugegriffen werden kann.

11.2. Schlusswort, häufige Fragen (FAQ)

Zu jedem Vorwort gehört auch ein Schlusswort. Finde ich zumindest. Jedenfalls vermisse ich Schlussworte oft, wenn ich mir am Ende vieler Bücher denke: Und jetzt?

Wie lange brauche ich, bis ich (richtig) gut programmieren kann?

Diese Frage stellen vorwiegend Anfänger. Die Antwort kann eigentlich nur Jahre lauten. Wie viele, hängt von den eigenen Zielen und der Definition von gut ab. Was ist gut, mit welchem Ergebnis gebe ich mich zufrieden? Ziele: Was will ich - vorrangig - programmieren? Kleine Skripte für Websites, Shell-Skripte, Anwendungsprogramme, Hardware-Treiber, umfangreiche Spiele, das eigene Betriebssystem? Je schwieriger die Aufgabe, je mehr Kenntnisse nötig sind, umso länger werden Sie brauchen.

Aber auch lebenslang ist eine gute Antwort (Grüße an die Schüler, die nichts mehr von lebenslangem Lernen hören können! ;-) ). Ähnlich gelagert wäre wohl die Frage Wie lange benötige ich, bis ich ein guter Chirurg bin?. Mit der Chirurgie gemeinsam hat die Programmierung übrigens, dass beide Tätigkeiten nicht durch Theorie allein erlernt werden können. Stattdessen hilft nur üben, anwenden und ausprobieren. Aber einen Vorteil haben Sie als Programmierer: Programmieren können Sie auch autodidaktisch - aus Büchern, Tutorials und anderen Quellen - lernen. Das für den Lerneffekt wichtige Feedback erhalten Sie vom Compiler (Interpreter).

Wie kann ich meine BASIC-Kenntnisse erweitern?

Wie bereits im Vorwort erwähnt, gibt es zu BASIC leider seit Jahren keine Bücher mehr. Dass sich auch der Autor dieses Tutorials irren kann, zeigt der folgende Link: QBASIC by Example: Special Edition (Programming (Que)) ;-)
Dabei handelt es sich um das einzige verfügbare Buch, das ich zu (Q)Basic bei Amazon gefunden habe. Sollte sich diese Situation ändern, weitere oder gar keine Bücher mehr lieferbar sein, ersuche ich um Mitteilung. Weitere Bücher, auch nicht mehr lieferbare, sind ggf. in der Bücher-Rubrik zu finden.

Größte Quelle ist mittlerweile das Internet. Es gibt immer noch zahlreiche Tutorials, die aber manchmal schwer zu finden sind. Eine sehr gute Zusammenstellung gibt es bei Thomas Antoni unter Antonis.de. Weitere Links sind in der Link-Rubrik (BASIC) zu finden.

Mein Programm funktioniert nicht! Was tun bei Fragen? Wo finde ich Hilfe?

Eines vorweg: Bitte schreiben Sie mir keine E-Mail! Ich leiste keinen E-Mail-Support. Ich habe leider weder die Zeit, auf jede programmier-bezogene (inhaltliche) Frage persönlich eingehen, noch Fehler in fremden Programmen zu suchen.

Was tun wenn's nicht läuft? Finden Sie den Fehler selbst! Fehlersuchen gehört zum Programmieren dazu! Nur durch Programmieren lernt man Programmieren. Stundenlang einen Fehler suchen gehört dabei dazu (weiß ich aus eigener Erfahrung).

Es läuft immer noch nicht? Weitersuchen, ggf. nochmal die Grundlagen lesen und lernen. Auch eine kurze Pause wirkt oft wahre Wunder, um Fehler in der eigenen Denkweise zu erkennen ("So kann's ja gar nicht funktionieren ..."). Fremde Hilfe in Anspruch zu nehmen, sollte immer nur den letzten Ausweg darstellen.

Natürlich können Sie Fragen stellen, auch erhöht reger Austausch unter Programmierern den Lerneffekt. Mehr dazu im Forum. Nutzen Sie bitte, bevor Sie einen neuen Beitrag schreiben, die Suchfunktion. Fragen werden i.d.R. mehrfach gestellt, und Ihre Frage lässt sich so vielleicht bereits beantworten.

Ich freue mich natürlich über Feedback zu diesem Tutorial. Zum Beispiel: Was ist gut erklärt, was lässt sich noch verbessern? Gibt es Fehler? Schreiben Sie aber bitte alle inhaltliche Fragen zur Programmierung, wenn Sie sie nicht selbst lösen konnten, immer ins Forum!


Weiterhin viel Spaß beim Programmieren wünscht der Autor dieses Tutorials,
Andreas Hammer

Vorheriges Kapitel