Jetzt wollen wir aber einmal versuchen, unsere gespeicherten Daten wieder einzu- lesen. Dies geschieht in etwa nach dem selben Schema. Zuerst müssen wir einen Kanal öffnen:
OPEN 1,8,2,"HIGHSCORE,S,R"
Wie Sie sehen, sieht dieser OPEN-Befehl fast genauso aus wie der obige. Ich habe hier also dieselben Parameter benutzt, bis auf den Kennungsbuchstaben der Betriebsart. Hier haben wir jetzt ein "R" was einen weiteren Modus umschreibt, nämlich "Read" für "Lese". Wir haben also wieder ein sequentielles File geöffnet mit der Filenummer 1, der Geräteadresse 8, der Sekundäradresse 2 und dem Namen "HIGHSCORE", diesmal allerdings zum Lesen, denn wir wollen ja unsere gespeicherten Daten wieder zurückholen. Dies geschieht mit einem neuen Befehl, einer kleinen Abwandlung von INPUT, dem INPUT#-Befehl. Wie Sie sehen ist auch hier einfach nur ein Doppelkreuz angehängt worden. Die Eingabe ist nun ja denkbar einfach. Wir müssen nach INPUT# nur noch die Filenummer unseres Kanal angeben und anschließend, durch Komma getrennt, die Variable, der das einzulesende Datum zugewiesen werden soll, also:
INPUT#1,x$ INPUT#1,na$ INPUT#1,sc
In "X$" hätten wir nun den String "Highscoreliste" gespeichert und in "NA$" den vorhin gepeicherten Namen "Fritz Meier". In "SC" steht jetzt 100000, die Punktzahl von Fritz Meier. Sie können diese Daten nun also wieder weiterverarbeiten. Übrigens sollte ich hier vielleicht erwähnen, daß der INPUT#-Befehl, ebenso wie INPUT, NICHT im Direktmodus anwendbar ist. Sie können ihn also ausschließlich NUR in Programmen anwenden. Auch sollten Sie den dazugehörigen OPEN-Befehl in diesem Programm aufführen, und nicht etwa im Direktmodus das File öffnen und anschließend ein Programm mit den obigen INPUT#-Anweisungen starten, da RUN leider die Merktabellen, die sich der 64er intern über alle geöffneten Filenummern anlegt, wieder löscht. Die Floppy bekommt jedoch davon nichts mit, so daß für sie der Kanal noch offen ist, für den Computer ist er allerdings geschlossen. Sie können sich vielleicht vorstellen, was für ein Chaos hierbei entstehen könnte... In solchen Fällen hift es dann immer, einmal kurz die Diskette aus dem Laufwerk zu holen, da die Floppy dann den Kanal ebenfalls (zumindest intern) schließt. Die Daten können dabei allerdings verloren gehen. Nachdem wir nun unsere Daten wieder eingelesen haben, müssen wir den Lesekanal natürlich wieder mit CLOSE schließen, also: CLOSE 1 Nun sollten sie mit SEQ-Files ja bestens umgehen können, was laden und speichern zumindest angehen. Die Floppy kennt jetzt allerdings noch eine weitere Betriebsart. Außer "Read" und "Write" gibt es nämlich auch noch "Append". Das ist englisch und heißt soviel wie "hinzu- oder anfügen". Mit diesem Modus können Sie also an eine schon früher erstellte Datei weitere Daten anhängen. Angenommen, Sie wollten vielleicht einen weiteren Highscore abspeichern, dann bräuchten Sie nur einen Floppykanal in der Betriebsart "Append" zu öffnen. Für "Append" kennt die Floppy das "A"- Kürzel, also:
OPEN 1,8,2,"HIGHSCORE,S,A"
Jetzt können Sie mit Hilfe von PRINT# weitere Daten an das alte File anhängen, nach "Fritz Meier" und 100000 könnten wir nun also auch z.B. "Heinz Müller" und 99999 an die Floppy schicken. Bei einem erneuten Einlesen der Datei müßten wir dann noch einmal gesondert alle Daten von vorne bis hinten auslesen. Kommen wir nun zur Fileart PRG. Wie ich oben ja schon erwähnte, ist diese Fileart nur für Programme reserviert. Trotzdem kann man sie von BASIC aus ansprechen und auch Daten in PRG-Files speichern. Dies wird ebenso gehandhabt wie mit SEQ, da PRG-Files, physisch gesehen, also im Aufbau auf der Diskette, ebenso angelegt werden, wie SEQ-Files. Der Zugriff auf ein PRG-File ist somit haargenau derselbe, mit dem einzigen Unterschied, daß jetzt an den Filenamen angehängt nicht mehr ein "S" als Parameter für die Fileart, sondern ein "P" für PRG steht. Der OPEN-Befehl für ein PRG-File sähe also folgender- maßen aus:
OPEN 1,8,2,"DATEI,P,R" zum Lesen, oder OPEN 1,8,2,"DATEI,P,W" zum Schreiben.
Ansonsten können Sie ebenso verfahen als hätten Sie ein SEQ-File geöffnet. Eines gibt es allerdings schon noch hierzu zu sagen. Der OPEN-Befehl hat für PRG-Files nämlich noch zwei kleine Sonderheiten eingebaut. Bei den Sekundäradressen hatte ich ja schon einmal angegeben, daß die Adressen 0 und 1 jeweils eine Son- derstellung einnehmen. Diese lassen sich jetzt sehr einfach erklären, nachdem wir uns mit der Materie der Betriebsart eines Files schon ein wenig beschäftigt haben. Mit der Sekundäradresse 0 können Sie der Floppy nämlich schon gleich angeben, daß Sie ein READ-File (also ein File aus dem Sie lesen) öffnen möchten. Gleichzeitig geht diese dann auch davon aus, daß es sich hierbei um ein PRG-File handelt, Sie können damit also die Angabe der File- und Betriebsart im Filenamen wegfallen lassen. Etwa ähnlich verhält es sich mit der Sekundäradresse 1. Sie gibt an, daß Sie Daten schreiben möchten, ebenfalls in ein PRG-File. Somit ergeben sich dann also folgende Vereinfachungen des OPEN-Befehls für PRG-Files:
OPEN 1,8,0,"DATEI" zum Lesen, und OPEN 1,8,1,"DATEI" zum Schreiben.
Wenn Sie allerdings ein PRG-File öffnen, um beispielsweise ein richtiges BASIC-Programm daraus auszulesen, aus welchen Gründen auch immer, so werden Sie mit INPUT# nicht viel Glück haben. INPUT# verläßt sich nämlich darauf, daß Sie vorher alle Ihre Daten mit PRINT# eingegeben haben, wobei Sie für jedes Datenelement einen eigenen PRINT#-Befehl benutzten. PRINT# arbeitet nämlich eben- so wie PRINT, wenn man keinen weiteren Parameter hinter dem Befehl angibt. Es macht einen sogenannten "Wagenrücklauf mit Zeilenvorschub". Oder auch "Carriage Return" genannt. In der Praxis wird bei diesem Wagenrücklauf nichts anderes getan, als daß der Cursor lediglich eine Zeile tiefer, in die erste Spalte die- ser Zeile befördert wird, und daß eine weitere Ausgabe auf dem Bildschirm an dieser Stelle dann ausgeführt wird. Der Wagenrücklauf hat auch einen eige- nen ASCII-Code (er ist eines der Steuerzeichen, die eine besondere Funktion erfüllen, wie ich bei den ASCII-Zeichen erwähnte), die 13 nämlich. Mit einem PRINT CHR$(13) erzwingen Sie also einen solchen Wagenrücklauf. Probieren Sie das doch einfach einmal mit folgendem Programm aus:
10 PRINT"DAS IST ZEILE 1";CHR$(13) 20 PRINT"DAS IST ZEILE 2"
Sie sehen, zwischen den beiden Zeilen ist nun eine Leerzeile, was ja ohne CHR$(13) nicht wäre. Der PRINT#-Befehl sendet nun ebenfalls ein CHR$(13) an die Floppy, nachdem er seine Daten übertragen hat. Beispielsweise die einzelnen ASCII-Code-Bytes der Buchstaben einer String-Variable. INPUT# erkennt nun an diesem Wagenrücklauf, daß hier das Ende des Strings erreicht ist und beendet seine Eingabe. Alle Zeichen, die vor dem Carriage Return kamen werden nun der Variablen zugeordnet, die am Ende von INPUT# steht, jedoch ohne dabei das CHR$(13) mit anzuhängen. Es dient also lediglich als Trennmarke, nicht aber als Datenelement. Das hat aber auch einen entscheidenden Nach- teil - sollten Sie einmal in die Verlegenheit kommen, einen Wagenrücklauf mitabzuspeichern, oder sollten Sie nicht wissen, ob der Wagenrücklauf überhaupt in einem File (z.B. ein PRG-File mit einem BASIC-Programm) existiert, so sollten Sie die Alternative zu INPUT# benutzen, den Befehl GET#. Wie Sie sehen haben wir auch hier ein Doppelkreuz, das für Filenummer steht, das Befehlswort selbst kann man etwa mit "Hole" übersetzen. Der 64er soll sich also ein Byte von dem Kanal mit der Filenummer, die hinter dem "#" angegeben wird, holen. Dies geschieht wie bei INPUT#, namlich folgendermaßen: GET#1,A$ Hiermit hätten wir der Variablen "A$" jetzt ein Byte vom Filekanal 1 zuge- wiesen. Dieses können wir jetzt weiter- verarbeiten. Entweder Sie geben es gleich mit PRINT aus, etwa so: PRINT A$; Oder Sie schauen sich an, ob wir hier überhaupt ein druckbares ASCII-Zeichen vorliegen haben, oder ob es sich hierbei nicht doch um ein Sonderzeichen handelt, indem Sie sich einfach den ASCII-Code des Bytes ausgeben lassen. Etwa so:
A=ASC(A$) IF A=13 THEN PRINT "DAS IST EIN CARRIAGE RETURN." IF A=19 THEN PRINT "DAS IST DAS 'HOME'-ZEICHEN."
oder einfach : PRINT ASC(A$) Allerdings gibt es hier noch ein kleines Problem. Da wir ja ein sequentielles File auslesen und bei diesem ein Byte nach dem anderen folgt, wird mit ziemli- cher Sicherheit auch irgendwann einmal das letzte Byte über den Kanal gewandert kommen und anschließend ist dann nix mehr los mit Bytes auslesen. Trotzdem aber holt sich GET# immer noch irgendwelche nicht existenten Bytes vom Kanal und übergibt diese an unser Programm, was ja nun nicht unbedingt sein soll. Hier hilft dann eine Sondervariable des 64ers. Ich spreche von der Statusvariablen "ST". Diesen Variablennamen dürfen Sie in Ihren Programmen übrigens NIE benutzen, da diese Variable halt für den eben genannten Zweck reserviert ist. BASIC stellt in dieser Variablen nämlich immer den sogenannten Status des Disketten- kanals bereit. Wie Sie sehen ist "ST" ja eine numerische Variable, also liefert sie einen Zahlenwert zurück. Sollten Sie nun bei einer Abfrage von ST einmal feststellen, daß Sie den Wert 64 beinhaltet, so sind Sie am Ende eines Diskettenfiles angelangt. Bei allen anderen Zahlen ist dies nicht der Fall. Das Durchlesen eines Files sähe also so aus:
10 OPEN 1,8,0,"PROGRAMM" 20 GET#1,A$ 30 PRINT A$ 40 IF ST<>64 THEN 100 50 CLOSE 1
"ST" dürfen Sie natürlich auch benutzen, wenn Sie mit INPUT# auslesen. Dies wäre sogar nur sinnvoll und wünschenswert, wenn Sie flexibel arbeiten möchten. Aus Platzmagel muß ich nun leider die heutige Folge dieses Kurses abschließen. Nächsten Monat werden wir dann mit einem neuen Hauptprogramm hier in der MD aufwarten können, durch das ich wieder mehr Platz haben werde ihnen die Sprache BASIC näherzubringen. Ich werde nächsten Monat dann das Thema Floppy noch been- den und Sie über die noch fehlenden Befehle von BASIC V2.0 aufklären. Dann müßten wir eigentlich mit allem durch sein, und Sie sollten das Grundzeug zu einem guten BASIC-Programmierer besit- zen. Doch noch sind wir nicht ganz so weit, deshalb verabschiede ich mich jetzt bis nächsten Monat, Ihr
Uli Basters.