CP/M offers a number of functions for working with files. The input/output functions base upon a length of a record - i.e. a block consisting of 128 bytes. In many cases a character (byte) base i/o is preffered instead of a block - e.g. such as the i/o using a console. Find here some routines for working with files. Most of them are used in my own library. |
Reading from a file | ||
---|---|---|
|
After succesfull opening the file the pointer must be set to 128.
This forces a record to be read before reading a character.
Not discussed here is the methode for checking the end of a file.
Handling a binary file this corresponds to the physical end of file,
handling a text file the „End of File" character (0x1AH , ^Z ) defines the state.
| |
Sample for reading a byte from any file | Sample for reading a character from a text file | |
Writing into a file | ||
|
After succesfull creating the file the pointer must be set to 0.
This indicates an empty record.
Closing a text file requires a final „End of File" character (0x1AH , ^Z ) to be written to the file.
| |
Sample writing a byte into any file | Sample writing a character into a text file |
APPEND
" does not exist, merely „OPEN
" (open existing file) and „CREATE
" (creating a new file).
The most simple way for doing an append would be to copy an existing file to a new one and proceed writing new data to that file.
(Of course it implies deleting an existing file and rename the file to the original one).
Es gibt Fälle, wo Daten als Protokoll in eine einzige Datei geschrieben werden sollen.
Das kann bedeuten, dass an eine bestehende Datei weitere Daten angehängt werden sollen.
Eine BDOS-Funktion „APPEND
" gibt es nicht, lediglich „OPEN
"
(Öffnen einer bestehenden Datei) und „CREATE
" (Anlegen einer neuen Datei).
Der einfachste Fall wäre, die bestehende Datei in eine neue Datei umzukopieren und
daran neue Daten anzuhängen.
(Wobei ein notwendiges Umbenennen und Löschen hier nicht erwähnt werden soll).
Bei großen Datenmengen muss hier neben dem Zeitfaktor für das Kopieren auch der benötigte
Speicherplatz für zwei Dateien berücksichtigt werden.
Eine andere Möglichkeit wird nun vorgestellt.
Anhängen an eine Datei |
---|
|
Hier eine Routine aus meiner Bibliothek und hier als Beispiel aus meiner TURBO-PASCAL Erweiterung |
fseek
und ftell
bekannt, die die Adresse eines Bytes innerhalb einer Datei verwalten.
ftell | fseek | |
---|---|---|
|
| |
Diese Funktion ermittelt die Position eines Bytes innerhalb einer sequentiellen Datei. | Diese Funktion stellt die Position eines Bytes innerhalb einer sequentiellen Datei wieder her. | |
|
| |
(In den Beispielen wird der Zeiger nicht bearbeitet.) | ||
Beispiel zum Ermitteln der Dateiposition | Beispiel zum Einstellen der Dateiposition | |
Eine andere Möglichkeit zur Festlegung der Dateiposition ohne die Rekordnummer lässt sich wie folgt durchführen (hier ohne die Ermittlung des Zeigers): | ||
ftell alternativ | fseek alternativ | |
|
| |
Beispiel zum Ermitteln der Dateiposition | Beispiel zum Einstellen der Dateiposition |
*
und ?
).
Zur Behandlung solcher Joker stehen die BDOS-Funktionen Search_for_first und Search_for_next zur Verfügung.
Damit kann nach Dateien gesucht werden.
Allerdings darf keine der anderen Datei-Operationen zwischen den Aufrufen der Suchfunktionen ausgeführt werden.
Zur Lösung dieses Problems gibt es drei Möglichkeiten.
FCB
".
Methode 1 | Methode 2 | Methode 3 |
---|---|---|
|
|
|
(In den Beispielen werden nur die Routinen zum Suchen dargestellt.) | ||
Beispiel | Beispiel | Beispiel |