ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
NKC Emulator
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
CP/M 68K
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

Arbeiten mit Dateien

In diesem Beitrag wird das Arbeiten mit Dateien unter CBASIC anhand von nützlichen Beispielen erläutert.

Weitere Beiträge

Vor- und Nachteile des CBASIC Compilers
Sprachumfang des CBASIC-Compilers
Definieren eigner Funktionen und Prozeduren
Auswertung von Kommandozeilenparametern

Lesen und Erstellen von Textdateien

Das erste Programm entfernt alle nicht notwendigen Leerzeichen am Ende von Zeilen in einer Textdatei. Das ist nützlich, da der Editor des Grundprogramms beim Löschen von Zeichen mit CTRL+G die Zeilenlänge nicht verkürzt. Als Nebeneffekt bei der Neuerstellung der Textdatei werden auch Überreste alten Textes am Ende der Datei entfernt.

Das Programm TRIM.BAS beginnt mit der Analyse der Kommandozeilen-Parameter.
Es müssen zwei unterschiedliche Dateinamen als Quelldatei und Zieldatei angegeben werden.

REM ================================================
REM Leerzeichen am Ende von Zeilen entfernen
REM ================================================

      split% = match(" ", COMMAND$, 1)
      IF split% = 0 THEN GOTO 9000
      source$ = LEFT$(COMMAND$, split%)
      dest$ = RIGHT$(COMMAND$, LEN(COMMAND$)-split%)
      IF source$=dest$ THEN GOTO 9030 : REM Beide Dateien sind gleich

Es folgt der Test, ob die Quelldatei vorhanden ist

      S% = SIZE(source$)
      IF S%=0 THEN GOTO 9010 : REM Quelldatei nicht vorhanden

Jetzt wird die Quelldatei geöffnet und die Zieldatei angelegt. Falls die Zieldatei schon vorhanden ist, wird sie ohne Warnung überschrieben.

      OPEN source$ AS 1 : REM Quelldatei öffnen
      CREATE dest$ AS 2 : REM Zieldatei anlegen / überschreiben

Zum Erkennen des Dateiendes der Quelldatei und zum Abfangen eventuell auftretender Fehler beim Schreiben dienen die folgenden beiden Zeilen.

      IF END #1 THEN 2100 : REM Ende der Quelldatei
      IF END #2 THEN 9020 : REM Fehler beim Schreiben

Jetzt erfolgt die eigentliche Verarbeitung. In der äußeren WHILE-Schleife wird die Quelldatei zeilenweise eingelesen, bis das Ende der Datei durch IF END #1 erkannt wird. Die innere WHILE-Schleife entfernt Leerzeichen am Ende der Zeile. PRINT USING schreibt de bearbeitete Zeile in die Zieldatei.

      WHILE 1
          READ #1; LINE L$
          WHILE RIGHT$(L$,1)=" "
              L$ = LEFT$(L$,LEN(L$)-1)
          WEND
          PRINT USING "&"; #2; L$
      WEND

Damit ist die Verarbeitung abgeschlossen und die Dateien können wieder geschlossen werden.

2100  CLOSE 1
      CLOSE 2
      STOP     

Abschließend noch die Ausgabe von Fehlermeldungen, die am Ende des Quelltextes zusammengeführt sind.

9000  PRINT "Usage: TRIM Source Destination"; : STOP                 
9010  PRINT "Source file not found"; : STOP                         
9020  PRINT "Write error, disk full?"; : STOP
9030  PRINT "Source and Destination must be different files"; : STOP


Ein kleines Telefonbuch

Zur Demonstration der Fähigkeiten von CBASIC auf satzbasierte Dateien mit fester Satzlänge zuzugreifen hier ein kleines Programm zur Verwaltung von Telefonnummern. Das Programm kann nach Bedarf angepasst oder erweitert werden. Zu beachten ist jedoch, dass bereits erstellte Datendateien ungültig werden, wenn die Satzlänge oder die Anzahl der Felder eines Satzes geändert werden.

Zu Beginn des Programms wird die Daten-Datei geöffnet und das Menü ausgegeben. In einer Endlosschleife wird die Tastatur abgefragt und je nach Tastendruck das gewünschte Unterprogramm aufgerufen.

REM =============================================================
REM Ein kleines Telefonbuch als Beispiel fuer Satzzugriffe
REM =============================================================

      GOSUB 1100 : REM Datei oeffnen
      GOSUB 1000 : REM Menue ausgeben
      WHILE 1
          WHILE NOT CONSTAT% : WEND
          I$ = CHR$(CONCHAR%) : PRINT CHR$(8); " "; CHR$(8);
          IF I$="N" OR I$="n" THEN GOSUB 2000 : GOSUB 1000
          IF I$="S" OR I$="s" THEN GOSUB 3000 : GOSUB 1000
          IF I$="L" OR I$="l" THEN GOSUB 4000 : GOSUB 1000
          IF I$="D" OR I$="d" THEN GOSUB 5000 : GOSUB 1000
          IF I$="E" OR I$="e" THEN GOTO 9000 
      WEND

Hier die beiden Unterprogramme zur Darstellung der Menüzeile und zum Öffnen bzw. Anlegen der Daten-Datei. Die Satzlänge ist auf 128 Byte eingestellt. Es gibt in diesem Beispiel keine Kontrolle, ob die eingegebenen Daten in die definierte Satzgröße passen. Zu lange Datensätze führen zu einem Laufzeitfehler.

1000  REM Menue-Ausgabe
      PRINT "Telefonbuch: N=Neu S=Suche L=Loeschen D=Drucken  E=Ende ";         
      RETURN

1100  REM Datei oeffnen oder anlegen
      IF SIZE("TELE.DAT") = 0 
         THEN CREATE "TELE.DAT" RECL 128 AS 1 
         ELSE OPEN "TELE.DAT" RECL 128 AS 1
      RETURN

In diesem Unterprogramm werden neue Kontaktdaten abgefragt und in der Datenbank gespeichert. Die Schleife sorgt dafür, dass eventuell gelöschte Einträge wiederverwendet werden. Die Variable X% (Erster Eintrag eines Datensatzes) enthält 0 für aktive Datensätze und Werte ungleich 0 für gelöschte Datensätze.

2000  REM Neuen Kontakt anlegen
      PRINT
      INPUT "Vorname: "; VORNAME$    
      INPUT "Name:    "; NAME$    
      INPUT "Telefon: "; TELEFON$    
      IF END #1 THEN 2010
      SN% = 1
      WHILE 1
          READ #1,SN%; X%,V$,N$,T$
          IF X%<>0 THEN GOTO 2010
          SN% = SN% + 1
      WEND
2010  PRINT #1,SN%; 0,VORNAME$,NAME$,TELEFON$     
      PRINT : RETURN

Das Unterprogramm durchsucht die gesamte Datenbank nach einem Namen oder einer Telefonnummer und gibt die passenden Einträge aus. Es werden auch Teile von Namen und Telefonnummern gefunden, die Groß- und Kleinschreibung wird ignoriert.

3000  REM Suche nach passenden Kontakten
      PRINT : INPUT "Suchbegriff: "; SUCH$    
      IF END #1 THEN 3010
      SN% = 1
      WHILE 1
          READ #1,SN%; X%,V$,N$,T$  
          P% = MATCH(UCASE$(SUCH$), UCASE$(V$+N$+T$), 1)
          IF P%>0 AND X%=0 THEN PRINT USING "###: & & &";SN%,V$,N$,T$
          SN% = SN% + 1
      WEND
3010  PRINT : RETURN    

Das Unterprogramm dient zum Löschen eines Eintrages anhand der Satznummer. Die Satznummern werden bei der Suche vor den Ergebnissen angezeigt. Eine Eingabe von 0 als Satznummer bricht den Vorgang ab.

4000  REM Loeschen eines Eintrags
      PRINT : INPUT "Satznummer: "; SN$
      DEL% = VAL(SN$)
      IF DEL%=0 THEN GOTO 4010
      PRINT #1,DEL%; 1," "," "," "
4010  RETURN

Dieses Unterprogramm listet alle aktiven Kontakte auf der Konsole. Eine Erweiterung zur Ausgabe auf dem Drucker ist relativ einfach umzusetzen.

5000  REM Ausgabe aller Kontakte als Liste
      PRINT 
      IF END #1 THEN 5010
      SN% = 1 
      WHILE 1
          READ #1,SN%; X%,V$,N$,T$
          IF X%=0 THEN PRINT USING "###: & & &";SN%,V$,N$,T$  
          SN% = SN% + 1
      WEND
5010  PRINT : RETURN

Den Abschluss des kleinen Programms bildet das Schließen der Datenbank.

9000  REM Ende des Programms
      CLOSE 1
      STOP

Achtung

Die Datei TELE.DAT, in der die Namen und Telefonnummern abgelegt sind, darf nicht mit dem Editor geöffnet werden, da der Editor des Grundprogramms die Struktur verändert. Dies führt zu einem Laufzeitfehler.