In die Datei geschaut
Wollen Sie in Dateien des C 16 herumschnüffeln oder sie gar ändern, dann haben wir hier das richtige Programm für Sie.
Mit dem Hilfsprogramm »P++Z« (Listing) können Sie alle sequentiellen Files bearbeiten, die sich mit »INPUT #« lesen lassen. Grundideen für dieses Programm sind:
— namentlich bekannte Dateien lesen, ohne das zuständige Anwenderprogramm zu benutzen,
— Dateien kopieren (Sicherheitskopien).
Sie können aber auch die einzelnen Variablen einer Datei verändern oder löschen. Beim Verändern müssen Sie darauf achten, daß der vorhandene Variablentyp erhalten bleibt. Wenn Sie nicht wissen, ob eine vorhandene Zahl vom zuständigen Anwenderprogramm als String oder Integervariable gelesen wird, dann sollten Sie Zahlen auch nur durch andere Zahlen ersetzen. Eine besondere Leistung des Programms ist die Absicherung gegen ein versehentliches Überschreiben von Daten. Vor dem Überschreiben einer Datei wird diese in »UTHELP« umbenannt und gespeichert. Die Umbenennung ist auf dem Bildschirm angezeigt. Sollten Sie nachträglich bemerken, daß beim Verändern einer Datei Fehler entstanden sind, so können Sie unter »UTHELP« auf die alte Datei zurückgreifen. Da auf jeder Diskette nur eine Datei mit dem Namen »UTHELP« gespeichert werden kann, sollten Sie vor dem Bearbeiten einer weiteren Datei Ihre letzten, mit »P++Z« vorgenommenen Änderungen überprüfen.
Vor dem Laden einer anderen Datei kontrolliert das Programm, ob ausgeführte Änderungen gespeichert wurden. Haben Sie dies noch nicht getan, so fragt Sie der Computer, ob Sie eine Speicherung wünschen.
Als weitere Programmierhilfen bieten wir Ihnen für »P++Z« eine Übersicht zur Programmstruktur (Tabelle 2) und die Variablenliste mit den Zeilennummern, in denen die Variable vorkommt (Tabelle 1).
(Herbert Wißmann/kn)| A$ | File-Variable 340 410 1090 1200 1260 1300 5440 5450 |
| EM$ | Error-Meldungen 25 29 5120 |
| EN | Error-Nummern 25 27 28 5120 5130 5140 |
| ES | Error-Trak 25 5120 |
| ET | Error-Sektor 25 5120 |
| GF$ | Anfangs-Zeichen 195 1090 1200 |
| GS | Gesamtzahl Variablen 340 350 1000 1080 1160 5430 |
| I | Indiz 280 320 340 400 410 440 |
| KT | Änderungs-Flag 270 1310 5400 9700 |
| L | Loop 1160 1190 1200 5430 5440 5450 9730 |
| N1$ | Aktuelle Datei 210 220 260 380 5070 5350 |
| N2$ | SAVE Datei 5070 5080 5090 5310 5410 5420 |
| N3$ | RVS + Dateiname 220 230 1000 1150 1100 5300 |
| Q$ | Hilfsvariable 27 28 270 290 390 1040 1050 1060 1070 1080 1100 1110 1180 1220 5050 9710 |
| Q% | Index 1080 1090 1260 1300 |
| S1$ | Strich 194 1010 1030 |
| S2$ | Sternenreihe 193 1090 |
| ST | Status 300 310 420 430 |
| X$ | Hilfsvariable 5000 5010 |
| Zeile | Bemerkung |
|---|---|
| 1 | Programmname, letzte Änderung, Programm-Länge |
| 19 | Sprung nach 190, da am Programmanfang oft benutzte Unterprogramme gut aufgehoben sind. |
| 24-29 | Floppy Error Unterprogramm |
| 190-195 | Standardvariable (Programmanfang) |
| 200-230 | N1$ und N3$ erhalten ihren Inhalt (siehe Variablenliste) |
| 250-350 | Die Anzahl der Variablen wird für die DIM-Anweisung ermittelt. Dieser Teil sichert auch beim kleinen Speicherplatz des C 16 eine optimale Ausnutzung. Bei mehr als 30 Variablen wird deren Anzahl angezeigt. |
| 370-460 | Die Variablen werden eingelesen. |
| 1000-1330 | Hier steht das Hauptprogramm. Zuerst gibt man die laufende Nummer der gewünschten Variable an. Diese wird gezeigt und man kann nach Eingabe von »A« diese ändern, beziehungsweise die Variable wird nach Eingabe von »L« gelöscht. Jede andere Eingabe führt das Programm wieder zur Zeile 1000. Ein »A« anstelle der laufenden Nummer läßt alle eingelesenen Variablen auf dem Bildschirm erscheinen. Hier sorgt Zeile 1170, daß, nachdem der Bildschirm einmal gefüllt wurde, eine Programmpause bis zum Drücken einer Taste eingelegt wird. |
| 1240-1250 | zeigen eine für Basic 3.5 spezielle Möglichkeit, eine Bildschirmzeile zu löschen. Zuerst muß der Cursor eine Zeile nach oben (dort steht »Welche Nummer ? xx«). Jetzt wird ein CHR$ (27) in den Bildschirm geschrieben. C 16-Besitzer sollten wissen, wenn dem CHR$(27) ein »Q« folgt, wird ab Cursorposition die Zeile gelöscht, ohne daß sich dabei die Cursorposition selbst verändert. Zeile 1250 löscht also eine Bildschirmzeile und schreibt dann an deren Anfang die Worte »NEUER INHALT:«. |
| 1270 und 1310 | setzen die Flags für Änderungen an der Datei auf 99. Diese Flags werden bei einem Speichervorgang wieder auf 0 gesetzt. |
| 5000 | wird nur angesprungen, wenn man versucht, das Programm zu beenden oder ein neues File einzulesen, bevor Änderungen gespeichert wurden. |
| 5030 | gibt die Möglichkeit, die Diskette zu wechseln oder auch den Speichervorgang abzubrechen. |
| 5070 | fragt nach dem neuen Dateinamen, gibt gleichzeitig den ursprünglichen Namen als »default« ins Eingabefeld. |
| 5100-5140 | überprüft, ob auf der eingelegten Diskette ein File mit gleichem Namen vorkommt, der dann in Zeile |
| 5300-5380 | sicherheitshalber in den Namen »UTHELP« umbenannt wird, also nicht sofort verloren geht. |
| 5400-5480 | enthält den eigentlichen Speichervorgang. Gespeichert wird unter Gebrauch der Variablen N2$ (gefüllt in Zeile 5070). |
| 9700 | Bei Eingabe eines »E« anstelle einer laufenden Nummer (Zeile 1000) wird das Programm beendet, wenn eventuell Änderungen gespeichert wurden oder die Frage nach Speichern verneint wurde. |
1 rem"@p++z":rem 6.10.85 psz=2586
3 rem **************
4 rem * h.wissmann *
5 rem * 02822 4922 *
6 rem * 30.11.83 *
7 rem **************
19 goto190
24 close15:open15,8,15
25 input#15,en,em$,et,es:ifen<2thenreturn
27 ifen=64thenq$="{down} ist kein seq.file {flon}!{flof}{down}":return
28 ifen=62thenq$="{down} gibt es nicht {flon}!{flof}{down}":return
29 print"{down} "em$" {rvon}{flon}error{flof}{rvof}":close15:end
190 gosub24
193 s2$="****************************************"
194 s1$="{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}"
195 gf$=chr$(34)
200 print"{clr}{dblu}** seq.files lesen/aendern **{down}{down} file name{down}"
210 n1$="":inputn1$:ifn1$=""then9720
220 n3$="{rvon}"+n1$+"{rvof}"
230 print"{down} bestand ";n3$
240 :
250 rem ** rec.zaehlen
260 open2,8,3,n1$+",s,r"
270 q$="":gosub25:ifq$<>""thenclose2:printq$:getkeyq$:goto200
280 i=1
290 input#2,q$
300 ifst=64then330
310 ifst<>0then25
320 i=i+1:goto290
330 close2
340 gs=i:dima$(i)
350 ifgs>30then print gs;" variable, einen moment bitte{down}"
360 :
370 rem ** rec.lesen
380 open2,8,3,n1$+",s,r"
390 q$="":gosub25:ifq$<>""thenclose2:printq$:getkeyq$:goto200
400 i=1
410 input#2,a$(i)
420 ifst=64then450
430 ifst<>0then25
440 i=i+1:goto410
450 close2
460 :
1000 print"{clr} dateiinfo ";n3$;" ";gs;"variable{down}"
1010 prints1$" bitte gewuenschte lfd.nummer eingeben"
1020 print" oder 0=neuer file, c=copy, e=ende"
1030 print" a=alle variablen listen":prints1$"{down}"
1040 q$="":input"{up} welche nr: ";q$
1050 ifq$="a"then1150
1060 ifq$="0"orq$="e"then9700
1070 ifq$="c"then5030
1080 q%=val(q$):ifq%<1orq%>gsthen1040
1090 print"{down}{down}";s2$;"{down} ";gf$;a$(q%);gf$:print"{down}";s2$;"{down} a=aendern l=loeschen"
1100 getkeyq$:ifq$="a"then1240
1110 ifq$="l"then1290
1120 goto1000
1130 :
1140 rem ** datei listen
1150 print"{clr} "n3$"{down}"
1160 forl=1togs
1170 ifpeek(205)<23then1190
1180 printn3$;"weiter nach return";:getkeyq$:print"{clr}";n3$:ifq$="e"then1000
1190 printusing"### ";l;
1200 print"= ";gf$;a$(l);gf$;"{down}"
1210 next
1220 getkeyq$:goto1000
1230 :
1240 rem ** aendern a$(q%)
1250 print"{up}"chr$(27)"qneuer inhalt:"
1260 inputa$(q%)
1270 kt=99
1280 goto1000
1290 rem ** loeschen
1300 a$(q%)=""
1310 kt=99
1320 goto1000
1330 :
5000 print"{clr}{down} > aenderung abspeichern{down}{down}":input" ja/nein";x$
5010 ifx$="nein"then9710:else ifx$<>"ja"then5000
5030 print"{clr} datei speichern"
5040 print"{down}{down} bitte gewuenschte zieldiskette einlegen und {rvon}return{rvof} (z=zurueck)"
5050 getkeyq$:ifq$="z"then1000
5060 print"{down} unter welchem namen soll die datei gespeichert werden {down}"
5070 print" "n1$:input"{up}";n2$:ifn2$=""then1000
5080 iflen(n2$)>15thenn2$=left$(n2$,15)
5090 print"{up} {rvon}";n2$;"{rvof}{down}{down}"
5100 open5,8,2,n2$+",s,r"
5120 input#15,en,em$,et,es
5130 close5:ifen=62then5400
5140 ifen<>0then29
5300 print"{clr}{down} die alte datei "n3$:print"{down} wird nun {rvon}'uthelp'{rvof}.{down}"
5310 print" danach wird '"n2$"' neu angelegt."
5320 print#15,"s:uthelp"
5330 gosub24:print" {rvon}s-ok{rvof}"
5350 print#15,"r:uthelp=";n1$
5360 gosub24:print" {rvon}r-ok{rvof}"
5380 :
5400 kt=0
5410 open1,8,2,n2$+",s,w"
5420 gosub25:print" {rvon}saving{rvof} "n2$
5430 forl=1togs
5440 ifa$(l)=""then5470
5450 print#1,a$(l)
5460 gosub25
5470 next
5480 close1:goto1000
5620 :
9700 ifkt=99thengoto5000
9710 ifq$="0"thenclr:goto190
9720 gosub25:close15
9730 forl=1to30:print:next
9740 print"ende"
9750 end