Lesen und Schreiben von Binärfiles
F
Bei der Speicherung von Information in "unformatierten" oder Binärfiles
werden Daten nicht als ASCII-codierte Buchstaben oder Ziffern, sondern als
direktes Abbild der Hauptspeicherinhalte, d.h. in der maschinenspezifischen
Darstellung, in das File geschrieben. Das hat neben dem gegenüber
ASCII-Files verringerten Platzbedarf noch den Vorteil, daß kein Bit
Information durch Konversionen verloren geht, man also ein Programm an einer
beliebigen Stelle abbrechen, die Daten sichern und später mit dem Programm
forfahren kann, als ob man es nie unterbrochen hätte.
Will man in F ein Binärfile lesen oder schreiben, so muß man es mit der
Option
form="unformatted"
im open-Statement öffnen
open(unit=...,form="unformatted",...)
Die eigentlichen Lese- und Schreibbefehle sehen genauso aus wie bei
formatierten Files, nur wird die fmt-Option weggelassen, also
read(unit=unit) variable_list
bzw.
write(unit=unit) expression_list
Eine Eigentümlichkeit von Fortran ist, daß in Binärfiles die Daten in
Records (Sätzen) organisiert sind, wobei beim Schreiben des Files jeder
write-Befehl einen neuen Record erzeugt. Umgekehrt wird beim Lesen mit
jedem read an den Beginn das nächsten Records gesprungen. Stehen also
in einem Record mehr Daten als die Variablenliste aufnehmen kann, so werden
sie ignoriert. Insbesondere überspringt der Befehl
read(unit=unit)
einen Record, ohne Daten zu lesen.
Wenn nicht anders angegeben, werden Files in Fortran im sequentiellen
Modus geöffnet, d.h. es wird ein Record nach dem anderen gelesen bzw. geschrieben. (Daneben gibt es aber auch sogenannte Direktzugriffsfiles.) Mit
den Befehlen
backspace(unit=unit)
und
rewind(unit=unit)
kann man jedoch an den Beginn des vorhergehenden Records bzw. an den Beginn
des Files springen.
C
In C müssen auf POSIX-kompatiblen Systemen beim Öffnen von Binärfiles
keine besonderen Optionen angegeben werden. Insbesondere kennt C auch keine
Recordstruktur, sondern man kann einen Lese- oder Schreibvorgang an
beliebigen Stellen (Byte-Adressen) des Files beginnen lassen.
Der Befehl für das Lesen von einem unformatierten File ist
fread(bufferpointer,size,
count,filepointer);
Dabei werden maximal count Elemente der Größe size (in Bytes)
von dem File, auf das filepointer zeigt, in den Buffer an der Adresse
bufferpointer übertragen. Der Rückgabewert der Funktion ist die
Anzahl der tatsächlich übertragenen Elemente. Zur Angabe der Größe eines
Elements verwendet man günstigerweise den sizeof-Operator. Will man
z.B. zehn float-Werte von einem File mit Filepointer fp in
einen Vektor x einlesen, so gibt man an
fread(&x[0],sizeof(float),10,fp);
(&x[0] ist die Adresse des ersten Elements von x.)
Der Befehl für das unformatierte Schreiben auf ein Binärfile ist
vollkommen analog
fwrite(bufferpointer,size,
count,filepointer);
Ein Nachteil von fread/fwrite gegenüber read/write in F besteht
darin, daß die C-Funktionen keine Liste von Werten oder Variablen
verarbeiten können. Will man also mit einem Lese- oder Schreibbefehl
mehrere Werte übertragen, so muß man sie in einen Buffer packen.
Ein File kann, ähnlich wie in F, mit
rewind(filepointer);
auf den Anfang positioniert werden. Eine beliebige Stelle eines Files kann
man mit
fseek(filepointer,offset,from);
erreichen. Das File wird (für den nachfolgenden Lese- oder Schreibvorgang)
offset Bytes relativ zu from positioniert; die speziellen Werte
SEEK_SET, SEEK_CUR und SEEK_END für from
bedeuten Anfang, gegenwärtige Position und Ende des Files. Mit
where=ftell(filepointer);
kann man die long int-Variable where auf die momentane Position
im File setzen.
File translated from
TEX
by
TTH,
version 3.33.
On 20 Jun 2003, 10:33.