Jetzt wollen wir aber einmal versuchen, unsere gespeicherten Daten wieder einzulesen. 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
64 er 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
" hinzuoder 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 folgendermaß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 Sonderstellung 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 Fileund 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 dieser 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 eigenen 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 Nachteil - 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 64 er 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 zugewiesen. Dieses können wir jetzt weiterverarbeiten. 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 ziemlicher 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 64 ers. 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 Diskettenkanals 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 beenden 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 besitzen. Doch noch sind wir nicht ganz so
weit, deshalb verabschiede ich mich jetzt bis nächsten Monat, Ihr
Uli Basters.