C 64
Grundlagen

Relative Dateien leicht verständlich

Die Datenverwaltung zählt – neben dem Spielen – wohl zu den häufigsten Anwendungsgebieten für Heimcomputer. Um Daten aber effektiv verwalten zu können, bedarf es des sinnvollen Einsatzes bestimmter Verfahren und Techniken.

Die relative Dateiorganisation, die sich vor allem bei der Verwaltung größerer Datenbestände als sehr nützlich erweist, ist eine davon und wird im folgenden Artikel näher erläutert.

Zunächst ein paar Worte zum Begriff der »Datei«. Eine Datei läßt sich am besten vergleichen mit einem Karteikasten mit vielen gleichartigen Karteikarten. Einer Karteikarte entspricht dabei ein sogenannter »Datensatz« der Datei. Jeder Datensatz unterteilt sich wiederum in verschiedene »Datenfelder«, in die die einzelnen Eintragungen auf der Karteikarte erfolgen.

Ein kleines Beispiel: In Bild 1 links sehen Sie, wie ein Eintragungs- bzw. Eingabeschema zur Verwaltung von Adressen aussehen könnte. Die Punkte zwischen den Ausrufezeichen markieren die Stellen, an die die einzelnen Daten jeweils geschrieben werden, wie Sie in Bild 1 rechts sehen können. Die Bereiche zwischen den Ausrufezeichen stellen also die einzelnen Datenfelder dar! Alle Inhalte der Datenfelder zusammen (das heißt eine komplette Adresse bestehend aus Nachname, Vorname, Straße, Wohnort und Telefon) ergeben dann einen Datensatz; mehrere gleichartige Datensätze eine Datei. (Eine schematische Darstellung dieses Sachverhalts finden Sie in Bild 2.)

Zwei Bildschirmmasken mit den Feldern Nachname, Vorname, Strasse, Wohnort und Telefon, links leer, rechts mit Beispieldaten ausgefüllt
Bild 1. Eine Adressenverwaltung als Beispiel einer Datei
Schema: Felder bilden Datensätze, Datensätze bilden die Datei, darunter ein Beispiel mit Adressdaten
Bild 2. So ist eine Datei im Prinzip aufgebaut

Um nun Daten mit dem Computer zu verwalten, gibt es beim Commodore 64 in Verbindung mit der Floppy VC 1541 grundsätzlich zwei Dateiarten: Die sequentielle und eben die relative.

Bei der sequentiellen Dateiorganisation werden alle Datensätze hintereinander, das heißt sequentiell gespeichert. Wenn nun Datensätze (in unserem Beispiel Adressen) gelesen, hinzugefügt, gelöscht oder geändert werden sollen – diese Vorgänge bezeichnet man übrigens als Dateiarbeit oder »Datenpflege« -, dann muß dazu die komplette Datei in den Rechner geladen und nach Beendigung der Datenpflege wieder auf die Diskette zurückgespeichert werden. Ein direkter Zugriff auf jeden einzelnen Datensatz der Datei ist nicht möglich.

Dieser Umstand ist einerseits sehr zeitraubend (die Floppy 1541 ist ja nicht gerade die Schnellste), andererseits macht er die maximale Dateigröße vom verfügbaren Speicherplatz im Rechner abhängig. Die sequentielle Datenspeicherung ist daher mehr etwas für kleinere Dateien (mit wenigen Datensätzen) oder für Dateien mit sehr kurzen Datensätzen (was wir uns später noch zunutze machen werden).

Wesentlich flexibler in bezug auf die Datenpflege ist die relative Dateiorganisation, die ja der eigentliche Gegenstand dieses Artikels ist. Bei ihr ist es nämlich möglich, direkt auf jeden einzelnen Datensatz – auch »Record« genannt – der Datei zuzugreifen! (Zusätzlich kann sogar auf eine beliebige Stelle innerhalb eines Records positioniert werden.)

Zum Prinzip der relativen Datei

Bei der relativen Dateiorganisation werden alle Datensätze (Records) in laufender Reihenfolge durchnumeriert. Der erste Datensatz bekommt dabei die Nummer 1, der zweite die Nummer 2, etc. Wenn Sie jetzt auf einen Datensatz zugreifen wollen, müssen Sie nur noch dessen Nummer angeben.

Dieser Vorteil ist allerdings mit einer wichtigen Bedingung verbunden:

Alle Records einer Datei müssen eine konstante, beim Einrichten der Datei festzulegende Länge zwischen 1 und 254 Byte (Zeichen) aufweisen!

Diese Bedingung wird verständlich, wenn man sich überlegt, wie das Floppy-Betriebssystem (kurz: Floppy-DOS) aus der Recordnummer die Position des Datensatzes auf der Diskette bestimmt.

Angenommen, Sie wollen auf den 27. Record einer Datei mit einer Recordlänge von 50 Byte zugreifen. Um nun die Position dieses Datensatzes zu ermitteln, multipliziert das Floppy-DOS die Recordlänge (in unserem Fall also 50) mit der Recordnummer -1 (also 26), was die Anzahl der Byte ergibt, die von den ersten 26 Records der Datei belegt werden (=1300 Byte). Dieser Wert wird jetzt noch zur Anfangsposition der Datei hinzuaddiert, was schließlich die Position des gewünschten Datensatzes ergibt. (Die ersten 26 Records werden durch das Aufaddieren ihrer Gesamtlänge auf den Anfang der Datei praktisch »übersprungen«.)

Jetzt wird auch der Name dieser Dateiart, nämlich »relativ«, verständlich, denn die Record-Position wird ja relativ zum Anfang der Datei ermittelt! (Im Beispiel beginnt der gewünschte Datensatz 1300 Byte vom Anfang der Datei entfernt.)

Wie gesagt kann also jeder Datensatz einer relativen Datei durch Angabe seiner Nummer direkt angesprochen werden. Wenn Sie aber zum Beispiel eine bestimmte Adresse suchen, werden Sie in der Regel kaum die Nummer des betreffenden Datensatzes kennen. Das gleiche gilt auch für die meisten anderen Anwendungsgebiete. (Höchstens bei einer Kontenverwaltung – zum Beispiel für ein Haushaltsbuch – wäre eine direkte Verwendung der Recordnummer sinnvoll.) Daher verwendet man in der Praxis häufig eine Mischform aus sequentieller und relativer Dateiorganisation, die »indexsequentielle Datei«.

Das Prinzip ist ganz einfach:

Alle Daten werden – wie bisher – in einer relativen Hauptdatei abgelegt. Zusätzlich wird dann eine sequentielle Index- oder Schlüsseldatei angelegt. Diese Schlüsseldatei enthält von jedem Datensatz der relativen Datei nur einen Teil – bei einer Adreßdatei zum Beispiel den Nachnamen – sowie die Recordnummer des zugehörigen Datensatzes der relativen Hauptdatei, in dem – im Beispiel – die komplette Adresse untergebracht ist.

Wenn Sie jetzt beispielsweise nach der Adresse eines Herrn Müller suchen, wird einfach die Schlüsseldatei komplett in den Computer geladen (da sie sehr kurz ist, geht dies ja relativ schnell, und auch die Maximalanzahl der Adressen ist verhältnismäßig hoch), dort durchsucht und – sofern der Datensatz »Müller« vorhanden ist – auf den bei »Müller« (in Form der Recordnummer) vermerkten Datensatz positioniert. Dieser wird dann schließlich in den Speicher geladen und ausgegeben.

Natürlich ist es auch möglich, zu einer relativen Hauptdatei mehrere Indexdateien anzulegen (zum Beispiel eine mit den Nachnamen als Index, eine mit den Vornamen, etc.). Allerdings muß man dann das eventuell wieder auftretende Speicherplatzproblem – die Indexdateien müssen ja komplett in den Speicher geladen werden – im Auge behalten beziehungsweise muß sich vor der Dateiarbeit entscheiden, mit welcher Indexdatei man jeweils arbeiten will.

Nach all der Theorie kommen wir nun zur Praxis:

Wie werden relative Dateien mit dem Commodore 64 und der Floppy VC 1541 – die Anlage relativer Dateien auf Kassette ist nicht möglich! – angelegt und verwaltet? Mit dieser Frage wollen wir uns im Folgenden ausführlich befassen. Zum Abschluß wird dann noch eine kleine, ausführlich kommentierte indexsequentielle Adreßverwaltung (Listing 2) vorgestellt, die Sie selbst nach Belieben abändern können, um so Ihre neuen Kenntnisse in der Praxis zu erproben.

Die Verwaltung einer relativen Datei gliedert sich grob in vier Abschnitte:

Da das Basic 2.0 des Commodore 64 leider keine speziellen Befehle zur Unterstützung von relativen Dateien zur Verfügung stellt, bleibt nur der Weg über »OPEN«- und »CHR$(...)«-Sequenzen. Daher sieht das Ganze auf den ersten (und wohl auch zweiten) Blick etwas kompliziert aus. Wenn man sich die erforderlichen Programmteile aber – wie in Listing 1 geschehen – als Unterprogramme schreibt, ist es halb so schlimm.

Kommen wir zum ersten Schritt, dem »Öffnen« der Datei.

Öffnen einer relativen Datei

Bei einer relativen Datei ist es – im Gegensatz zum Beispiel zur sequentiellen Datei – praktisch egal, ob die Datei auf der Diskette schon eingerichtet ist oder nicht oder ob Sie Daten lesen oder schreiben wollen. Der Öffnungsbefehl ist immer derselbe:

OPEN LF,GA,SA,DN$+",L," +CHR$(RL)

Die einzelnen Variablen – auch »Parameter« genannt – haben folgende Bedeutung:

LF: Das ist die logische Filenummer der Datei. Sie ist erforderlich, damit der Computer bei späteren Lese- oder Schreibbefehlen (bei denen diese Nummer angegeben werden muß) weiß, aus welcher Datei gelesen oder in welche Datei geschrieben werden soll. LF kann Werte zwischen 1 und 127 annehmen.

GA: Das ist die Geräteadresse der Floppy. Im Normalfall also 8.

SA: Die »Sekundäradresse« oder »Kanalnummer« SA hat auf Floppy-Ebene eine ähnliche Bedeutung wie die logische Filenummer LF auf Computer-Ebene.

Für uns ist aber nur wichtig, daß SA Werte zwischen 2 und 14 annehmen kann.

Wenn Sie mehrere Dateien gleichzeitig geöffnet haben, müssen Sie außerdem darauf achten, daß Sie jeder Datei eine andere Sekundäradresse zuweisen. Wird nämlich eine zweite Datei mit derselben Sekundäradresse wie die erste geöffnet, so wird die zuerst geöffnete Datei auf Floppy-Ebene geschlossen!

In diesem Zusammenhang noch ein wichtiger Hinweis:

Auf Floppy-Ebene können maximal drei Dateien gleichzeitig geöffnet sein. (Auf Computer-Ebene sind es übrigens maximal 10). Da zur Verwaltung einer relativen Datei neben der eigentlichen Datei – wie wir gleich noch sehen werden – auch der Floppy-Kommandokanal geöffnet werden muß, bedeutet das, daß maximal eine relative und eine sequentielle Datei gleichzeitig geöffnet sein können (was gerade für eine indexsequentielle Dateiorganisation reicht).

DN$: DN$ enthält den Namen der Datei. Dieser darf maximal 16 Zeichen lang sein. Außerdem ist darauf zu achten, daß kein File (=Datei oder Programm) desselben Namens bereits auf der Diskette existiert – außer natürlich eine früher definierte relative Datei dieses Namens, mit der Sie jetzt arbeiten wollen, denn sonst gibt es einen »FILE EXISTS ERROR«.

",L,": Dieser Parameter teilt dem Floppy-DOS mit, daß eine relative Datei geöffnet werden soll. (Die Kommas dienen zur Abtennung von den übrigen Parametern.)

RL: RL enthält die gewünschte Recordlänge der Datei und kann Werte zwischen 1 und 254 annehmen.

Wichtig: Die beim ersten Öffnen der Datei angegebene Recordlänge kann später nicht mehr geändert werden! (Wenn Sie versuchen, eine bereits existierende relative Datei mit einer anderen Recordlänge als bei der ersten Öffnung angegeben zu öffnen, so wird ein »RECORD NOT PRESENT ERROR« angezeigt.)

Zur Ermittlung der Recordlänge zählen Sie einfach alle Datenfeldlängen eines Datensatzes zusammen. Im Eingangsbeispiel ergibt das eine Länge von 15 (Nachname) + 10 (Vorname) + 15 (Straße) + 15 (Wohnort) + 11 (Telefon) = 66 Byte.

Sofern Sie zum Einlesen der Records in den Computer den INPUT #-Befehl benutzen, müssen Sie dazu noch ein Byte addieren, denn, um das Ende eines Records erkennen zu können, benötigt der INPUT #-Befehl ein »RETURN« (entspricht CHR$(13)) oder ein Komma (entspricht CHR$(44)) am Ende des Records. Das »RETURN« wird normalerweise am Ende eines jeden PRINT- beziehungsweise PRINT #-Befehls gesendet – sofern Sie es nicht durch ein Semikolon am Ende des PRINT-Kommandos (zum Beispiel bei »PRINT #1, " text";«) unterdrücken.

Im Beispiel ergibt sich also eine Gesamtlänge von 67 Byte. Nachdem die Datei geöffnet wurde, kann mit der eigentlichen Dateiarbeit begonnen werden. Um jetzt einen bestimmten Record zu schreiben beziehungsweise zu lesen, muß zunächst auf ihn positioniert werden.

Positionieren auf einen Record

Da die Positionieranweisung über den Floppy-Kommandokanal gesendet werden muß, muß dieser zuerst mit »OPEN 15,8,15,« geöffnet werden. Die erste 15 ist wieder die logische Filenummer (Um Kollisionen mit Dateien zu vermeiden, ist es zweckmäßig, hier immer dieselbe logische Filenummer zu verwenden); bei der 8 handelt es sich um die Geräteadresse der Floppy. Die zweite 15 ist die Kanalnummer des Floppy-Kommandokanals.

Der Positionierbefehl ist ähnlich kompliziert aufgebaut wie der OPEN-Befehl:

PRINT#15,"P"+CHR$(SA)+CHR$(LB)+CHR$(HB)+CHR$(RP)

Die Parameter im einzelnen:

SA: Das ist die beim Öffnen der Datei festgelegte Sekundäradresse.

LB/HB: Das ist die Recordnummer in einer für Sie vielleicht etwas ungewohnten Form, der sogenannten Lowbyte-/Highbyte-Form.

Da mit CHR$(...) nur Werte bis zu 255 übermittelt werden können, muß die Recordnummer in zwei solcher Werte aufgeteilt werden, die sich aus folgenden Formeln ergeben:
HB=INT(RN/256):LB=RN-256*HB

RP: Mit RP können Sie auf eine bestimmte Stelle innerhalb des Records positionieren. Wollen Sie zum Beispiel einen Record ab dem 10. Zeichen einlesen, so muß RP den Wert 10 erhalten.

Wichtig: Eine Positionierung auf eine Stelle innerhalb eines Records ist nur beim Lesen dieses Records sinnvoll. Zum Schreiben eines Records muß RP auf 1 gesetzt werden!

Und natürlich ist auch nur eine solche Positionsangabe sinnvoll, die kleiner gleich der Recordlänge ist. Daher ergibt sich für RP – eine entsprechende Recordlänge vorausgesetzt – ein Maximalwert von 254.

Nach der Positionierung ist der betreffende Record nun für einen Lese- oder Schreibzugriff bereit.

Schreiben eines Records

Vor dem Schreiben eines Records sind drei Dinge zu beachten:

Sind diese Voraussetzungen erfüllt, so kann der Record mit folgendem Befehl geschrieben werden:

PRINT#LF,RC$

LF ist dabei die beim OPEN-Befehl festgelegte logische Filenummer; RC$ enthält den zu schreibenden Record.

In diesem Zusammenhang erwähnenswert ist die Fehlermeldung »RECORD NOT PRESENT ERROR«, was soviel bedeutet wie »Datensatz nicht vorhanden«. Falls nämlich auf einen Record zugegriffen (geschrieben/gelesen) wird, der zuvor noch nicht beschrieben wurde, so wird diese Meldung erzeugt. Beim (erstmaligen) Schreiben eines Records kann diese Meldung natürlich ignoriert werden. (Der Schreibbefehl wird trotz der Meldung ausgeführt.)

Weiterhin ist zu beachten: Ein Schreibbefehl auf einen zuvor noch nicht beschriebenen Record hat zur Folge, daß alle davor liegenden (zuvor noch nicht beschriebenen) Records ebenfalls beschrieben werden!

Ein Beispiel: Sie haben eine relative Datei bereits bis zum 20. Record beschrieben. Nun schreiben Sie den 100. Record. Dadurch werden gleichzeitig die Records 21 bis 99 (mit demselben Inhalt wie der 100. Record) beschrieben!

Wenn Sie also eine relative Datei nicht der Reihe nach beschreiben wollen, dann sollten Sie beim Einrichten der Datei als erstes den Record mit der höchsten Nummer (mit einem beliebigen Inhalt) beschreiben. Dadurch bleiben Ihnen unnötige Wartezeiten bei der Dateiarbeit – das Beschreiben von zum Beispiel 50 Records nimmt einige Zeit in Anspruch – erspart.

Lesen eines Records

Zum Lesen eines Records gibt es zwei Möglichkeiten:

Die erste Möglichkeit stellt der INPUT #-Befehl dar. Mit ihm kann ein Record komplett in den Computer geladen werden – unter zwei Bedingungen: Der Record darf nicht länger als 88 Zeichen sein, und er muß ein »RETURN« oder ein Komma als letztes Zeichen aufweisen.

Das Befehlsformat: INPUT#LF,RC$

LF ist dabei die beim OPEN-Befehl festgelegte logische Filenummer; RC$ wird der Record zugewiesen.

Eine zweite Möglichkeit – bei einer Recordlänge von mehr als 88 Byte zudem die einzige – bietet der GET #-Befehl. Um zum Beispiel einen 100 Byte langen Record einzulesen, wäre folgende Befehlssequenz denkbar:

FOR I=1 TO 100:GET#LF,EG$:RC$=RC$+EG$: NEXT I

LF ist dabei wieder die beim OPEN-Befehl festgelegte logische Filenummer.

Schließen einer relativen Datei

Nach Beendigung der Dateiarbeit muß die Datei geschlossen werden. Der dazu erforderliche Befehl ist – ausnahmsweise – sehr einfach.

CLOSE LF

LF ist dabei wiederum die beim OPEN-Befehl festgelegte logische Filenummer.

Zum Abschluß eine kleine Adreßverwaltung zum Experimentieren. Bitte geben Sie dazu Listing 2 ein.

Wichtig: Das Programm ist nur mit den in Listing 1 enthaltenen Unter-Programmen lauffähig. Tippen Sie also am besten zuerst Listing 1 ein und speichern es (für spätere eigene Entwicklungen, für die Sie die Unterprogramme gut gebrauchen können). Danach geben Sie zusätzlich Listing 2 ein und speichern das Gesamtprogramm dann ebenfalls auf Diskette.

Da das Programm selbst ausführlich dokumentiert ist, möchte ich an dieser Stelle nur noch kurz ein paar Bedienungshinweise geben:

Nachdem das Hauptmenü ausgegeben wurde, geben Sie als erstes »1« (+ "RETURN") ein. Dadurch werden alle notwendigen Vorbereitungen für die Dateiarbeit getroffen. Sobald das Hauptmenü wieder erschienen ist, können Sie wahlweise (und auch abwechselnd) Adressen ein- oder ausgeben. Bei der Ausgabe wird dabei der Nachname als Index verwendet. Nach Beendigung der Dateiarbeit geben Sie »4« ein, wodurch die Datei ordnungsgemäß geschlossen und das Programm beendet wird.

Das Programm ist zwar recht spartanisch, dafür aber sehr flexibel. Beides soll Sie dazu animieren, selbst tätig zu werden und das Programm nach Ihren speziellen Wünschen abzuändern und zu ergänzen. Denn auch bei der Datenverwaltung gilt, wie überall: Übung macht den Meister!

(Martin Hecht/gk)
1680 rem--- unterprogramme zur verwaltung von relativen dateien ----------------
1690 rem--- (w) 1985 by martin hecht,stgt --------------------------------------
1700 :
1710 :
1720 :
1730 rem--- oeffnen einer relativen datei --------------------------------------
1740 :
1750 rem  lf = logische filenummer
1760 rem  sa = sekundaeradresse
1770 rem  dn$= dateiname
1780 rem  rl = recordlaenge
1790 :
1800 open 15,8,15:rem floppy-kommandokanal oeffnen
1810 open lf,8,sa,dn$+",l,"+chr$(rl):rem datei oeffnen
1820 :
1830 return
1840 :
1850 :
1860 :
1870 rem--- positionieren auf einen record -------------------------------------
1880 :
1890 rem  sa = sekundaeradresse
1900 rem  rn = recordnummer
1910 rem  rp = position innerhalb des records
1920 :
1930 hb=int(rn/256):lb=rn-256*hb:rem recordnummer in low/high aufteilen
1940 print#15,"p"+chr$(sa)+chr$(lb)+chr$(hb)+chr$(rp)
1950 :
1960 return
1970 :
1980 :
1990 :
2000 rem--- schliessen einer (relativen) datei ---------------------------------
2010 :
2020 rem  lf = logische filenummer
2030 :
2040 close lf:rem relative datei schliessen
2050 close 15:rem floppy-fehlerkanal schliessen
2060 :
2070 return
Listing 1. Unterprogramme zur Verwaltung einer relativen Datei
100 rem--- adressverwaltung mit indexsequentieller dateiorganisation -----------
110 rem--- (w) 1985 by martin hecht,stgt ---------------------------------------
120 :
130 :
140 :
150 rem--- dimensionierungen ---------------------------------------------------
160 :
170 dm=100:rem maximale datensatzanzahl
180 :
190 dim id$(dm):rem indexfeld (enthaelt nachnamen)
200 dim in(dm):rem enthaelt zugehoerige recordnummern
210 dim ds$(5):rem datenfelder
220 :
230 :
240 :
250 rem--- hauptmenue ----------------------------------------------------------
260 :
270 wl=0:print:print
280 print tab(11) "adressenverwaltung"
290 print
300 print tab(8)"-1-: dateiarbeit beginnen"
310 print tab(8)"-2-: adressen eingeben"
320 print tab(8)"-3-: adressen ausgeben"
330 print tab(8)"-4-: dateiarbeit beenden"
340 print
350 :
360 print tab(11) "ihre wahl (1-4)";:input wl
370 :
380 if wl=1 then gosub 490:rem dateiarbeit beginnen
390 if wl=2 then gosub 710:rem adressen eingeben
400 if wl=3 then gosub 1110:rem adressen ausgeben
410 if wl=4 then goto 1480:rem dateiarbeit beenden
420 :
430 goto 270:rem zurueck zum hauptmenue
440 :
450 :
460 :
470 rem--- dateiarbeit beginnen ------------------------------------------------
480 :
490 lf=1:sa=2:dn$="reladr":rl=67:gosub 1800:rem relative datei 'reladr' oeffnen
500 :
510 open 2,8,3,"seqadr,s,r":rem sequentielle datei 'seqadr' zum lesen oeffnen
520 :
530 gosub 1620:rem floppy-fehlerkanal auslesen
540 if er<>0 then ad=0:goto 590:rem datei ist noch nicht angelegt
550 :
560 input#2,ad:rem anzahl der datensaetze
570 for i=1 to ad:input#2,id$(i),in(i):next i:rem indexdatei einlesen
580 :
590 fl=1:rem kennzeichnung fuer 'datei im rechner'
600 :
610 close 2:rem sequentielle datei schliessen
620 :
630 print:print:print tab(7) "dateiarbeit kann beginnen !"
640 :
650 return
660 :
670 :
680 :
690 rem--- adressen eingeben ---------------------------------------------------
700 :
710 if fl=0 then print:print tab(8) "keine datei im rechner !":return
720 :
730 rem adresse eingeben
740 print:print
750 input "nachname (15) :";ds$(1)
760 input "vorname (10) :";ds$(2)
770 input "strasse (15) :";ds$(3)
780 input "wohnort (15) :";ds$(4)
790 input "telefon (11) :";ds$(5)
800 :
810 rem adresse in indexdatei vermerken
820 ad=ad+1:rem anzahl der adressen um 1 erhoehen
830 id$(ad)=ds$(1):rem nachname
840 in(ad)=rn:rem recordnummer
850 :
860 rem adressfelder auf richtige laenge bringen
870 le$="               ":rem leerstring zum auffuellen der felder
880 ds$(1)=left$(ds$(1)+left$(le$,abs(15-len(ds$(1)))),15)
890 ds$(2)=left$(ds$(2)+left$(le$,abs(10-len(ds$(2)))),10)
900 ds$(3)=left$(ds$(3)+left$(le$,abs(15-len(ds$(3)))),15)
910 ds$(4)=left$(ds$(4)+left$(le$,abs(15-len(ds$(4)))),15)
920 ds$(5)=left$(ds$(5)+left$(le$,abs(11-len(ds$(5)))),11)
930 :
940 rem adresse fuer speicherung zusammenfassen
950 rc$=""
960 for i=1 to 5:rc$=rc$+ds$(i):next i
970 :
980 rem adresse speichern
990 rn=ad:rp=1:gosub 1930:rem auf record (nr.=ad) positionieren
1000 print#lf,rc$:rem adresse in record schreiben
1010 gosub 1600:rem floppy-fehlerkanal auslesen
1020 :
1030 print:print:printtab(5)"adresse ist gespeichert !"
1040 :
1050 return
1060 :
1070 :
1080 :
1090 rem--- adressen ausgeben ---------------------------------------------------
1100 :
1110 if fl=0 then print:print tab(8) "keine datei im rechner !":return
1120 :
1130 print:print:input "nachname";nn$:rem index erfragen
1140 :
1150 for i=1 to ad:rem indexdatei durchsuchen
1160 if nn$=id$(i) then gn=i:i=ad:next i:goto 1220:rem index gefunden
1170 next i
1180 :
1190 print:print:print tab(5) "adresse ist nicht vorhanden !"
1200 return
1210 :
1220 rn=gn:rp=1:gosub 1930:rem auf record (nr. = in(i)) positionieren
1230 input#lf,rc$:rem record einlesen
1240 :
1250 rem record aufteilen
1260 ds$(1)=mid$(rc$,1,15):rem nachname
1270 ds$(2)=mid$(rc$,16,10):rem vorname
1280 ds$(3)=mid$(rc$,26,15):rem strasse
1290 ds$(4)=mid$(rc$,41,15):rem wohnort
1300 ds$(5)=mid$(rc$,56,11):rem wohnort
1310 :
1320 rem record ausgeben
1330 print:print
1340 print "nachname: ";ds$(1)
1350 print "vorname: ";ds$(2)
1360 print "strasse: ";ds$(3)
1370 print "wohnort: ";ds$(4)
1380 print "telefon: ";ds$(5)
1390 :
1400 print:print:print "weiter mit 'space' !"
1410 get t$:if t$<>chr$(32) then 1410:rem warten auf 'return'
1420 :
1430 return
1440 :
1450 :
1460 :
1470 rem--- dateiarbeit beenden -------------------------------------------------
1480 print#15,"s:seqadr":rem indexdatei auf diskette loeschen
1490 :
1500 open 2,8,3,"seqadr,s,w":rem seq. datei 'seqadr' zum schreiben oeffnen
1510 print#2,ad:rem anzahl der datensaetze
1520 for i=1 to ad:print#2,id$(i)","in(i):next i:rem indexdatei speichern
1530 :
1540 gosub 2040:rem relative datei schliessen
1550 :
1560 end:rem programm beenden
1570 :
1580 :
1590 :
1600 rem--- floppy-fehlerkanal auslesen -----------------------------------------
1610 :
1620 input#15,er,er$,tr,sk
1630 :
1640 return
1650 :
1660 :
1670 :
Listing 2. Eine einfache Adreßverwaltung als Beispiel für eine indexsequentielle Datei
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →