^9.3 Anlegen, Öffnen und Schließen von DateienUm mit einer Datei arbeiten zu können, müssen Sie sie zuerst "öffnen" (was beim Anlegen automatisch geschieht) und nach Gebrauch wieder "schließen". Dabei legen Sie fest, ob Sie Daten in die Datei schreiben (write), aus ihr lesen (read) oder beides (read/write) wollen (Parameter 'accessFlags$'). Read/Write ist der Standard.Da GEOS ein MultiThread-System ist, kann es passieren, dass andere Programme gleichzeitig auf diese Datei zugreifen wollen. Deswegen müssen Sie festlegen ob und wie andere Programme gleichzeitig auf Ihre Datei zugreifen dürfen (read, write, read/write bzw. gar nicht). Der Standard ist, keinerlei Zugriff zu erlauben (Parameter 'alienFlags$'). Sie sollten davon nur abweichen, wenn es unbedingt erforderlich ist, da das System in diesem Fall viele Daten zwischenspeichern muss, was den Systemspeicher sehr belasten kann.
FileCreateLegt eine Datei auf dem Datenträger an und öffnet sie. Existiert die Datei schon, kann sie auch verwendet (Daten bleiben erhalten) oder verworfen werden.
Der Dateizeiger ist nach dem Anlegen einer Datei immer auf die Position 0 gesetzt, auch wenn sie schon Daten enthält. Wollen Sie Daten anhängen, müssen Sie ihn zunächst mit der Anweisung FileSetPos ans Dateiende setzen. Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiele und eine ausführliche Beschreibung der Flagzeichen finden Sie weiter unten. Mögliche Fehlerbedingungen für FileCreate sind unter anderem:
FileOpenÖffnet eine Datei. Die Datei muss schon auf dem Datenträger vorhanden sein.
Der Dateizeiger ist nach dem Öffnen einer Datei immer auf die Position 0 gesetzt. Wollen Sie Daten anhängen, müssen Sie ihn zunächst mit der Anweisung FileSetPos ans Dateiende setzen. Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiele und eine ausführliche Beschreibung der Flagzeichen finden Sie weiter unten. Mögliche Fehlerbedingungen für FileOpen sind unter anderem:
Flagzeichen für FileCreate und FileOpenDie Befehle FileCreate und FileOpen erwarten ein oder zwei Zeichenketten, in denen durch einzelnen Buchstaben symbolisiert ist, was Sie wollen. Das Setzen einzelner Bits oder, wie hier, Zeichen, wird üblicherweise als das Setzen von "Flags" (Flaggen) bezeichnet.
|
FileOpen "info.txt", "r" 'Nur Lesezugriff zugelassen
'Kein Fremdzugriff, da keine alienFlags$ angegeben.
FileCreate "info.txt", "orw" 'Öffnen einer vorhandenen Datei oder Anlegen
'einer Neuen mit Schreib- und Lesezugriff.
'Eventuell vorhandenen Daten bleiben erhalten.
'Kein Fremdzugriff, da keine alienFlags$ angegeben.
FileCreate "info.txt", "gtw" 'Öffnen einer vorhandenen GEOS-Daten-Datei
'oder Anlegen einer Neuen zum Schreibzugriff,
'ohne Lesezugriff. Eventuell vorhandene Daten
'werden gelöscht.
'Kein Fremdzugriff, da keine alienFlags$ angegeben.
|
Tipps:
Beispiele für FileOpen und FileCreate:Die folgenden Beispiele setzen voraus, dass eine FILE-Variable folgendermaßen definiert ist: |
DIM fh AS FILE |
|
Anlegen einer DOS-Datei zum Lesen und schreiben. Existiert die Datei schon, soll die Variable fileError gesetzt werden. Fremdprogramme sollen während dessen keinen Zugriff haben: |
fh = FileCreate "Info.TXT" |
|
Diese Anweisung ist identisch mit: FileCreate "Info.TXT", "rw", ""
|
fh = FileCreate "Meine Daten" , "g", "r" |
|
|
fh = FileCreate "Mein Daten-Logbuch", "gtw" |
|
|
fh = FileCreate "Data.dat", "o" |
|
|
fh = FileOpen "Info.TXT" |
|
Diese Anweisung ist identisch mit: FileOpen "Info.TXT", "rw", ""
|
fh = FileOpen "Meine Daten", "rw", "r" |
|
|
fh = FileOpen "Daten.TXT", "r" |
|
|
fh = FileCreate "Data.dat", "o" |
FileCloseSchließt eine offene Datei. Alle evt. noch im Hauptspeicher befindlichen Daten werden auf den Datenträger geschrieben. Nach dem Schließen haben andere Programme wieder den vollen Zugriff auf die Datei, die von FileOpen bzw. FileCreate gesetzten Restriktionen sind aufgehoben.Syntax: FileClose <fh> Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiel: |
DIM fh AS FILE fh = FileOpen "info.txt" ... FileClose fh |
NullFileLiefert eine "leere" Dateivariable zurück, dient also zum Löschen einer Dateivariablen.Syntax: <dateiVariable> = NullFile(). Die Klammern sind erforderlich. Nachdem die Datei geschlossen wurde (FileClose), sollten Sie der Dateivariablen mit Hilfe der Funktion NullFile() die Information "keine Datei" zuweisen. |
DIM fh AS FILE ... FileClose fh fh = NullFile() |
|
|
IF fh <> NullFile() THEN ... |
|
|
FileClose fh x = FileRead (fh) |
gibt es einen BASIC Laufzeitfehler und das Programm wird beendet.
^9.4 Lesen und Schreiben von BinärdateienFileRead, FileWrite und FileInsert sind Universalroutinen. Sie arbeiten mit allen Dateien und allen Typen von Variablen zusammen, einschließlich Strings und Strukturen. Dateien, die nicht aus einer Abfolge von Textzeilen bestehen werde allgemein als binäre Dateien oder Binärdateien bezeichnet. Für die Arbeit mit Textdateien (lesen und schreiben von Textzeilen) gibt es zusätzlich darauf spezialisierte Routinen, siehe Kapitel 9.5.FileReadLiest eine bestimmte Anzahl von Bytes aus einer Datei. Der Dateizeiger wird hinter die gelesenen Daten gesetzt. Die Daten werden entsprechend dem Typ des Ausdrucks, in dem FileRead vorkommt, interpretiert.
Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiele: |
y = FileRead (fh, 2) ' Lesen eines Word-Wertes (2 Byte) |
y = FileRead (fh, 2, TRUE) ' Lesen eines Integerwertes (2 Byte) |
text$ = FileRead (fh, 100) ' 100 Byte lesen und als Text ansehen. ! Ein String endet, wenn eine binäre Null (ASCII-Code Null) ! gelesen wird. ! LEN(stringVariable) kann daher kleiner als 'size' sein. ! Trotzdem werden 'size' Bytes gelesen. |
DIM time AS DateAndTime time = FileRead (fh, SizeOf(time)) ' Lesen einer Struktur |
FileWriteSchreibt eine bestimmte Anzahl von Bytes in eine Datei, indem vorhandene Daten überschrieben werden. Bei Bedarf werden die Daten angehängt, d.h. die Datei wird verlängert. Der Dateizeiger wird hinter die geschriebenen Daten gesetzt.
Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiele: |
FileWrite (fh, n, 2) ' Schreiben eines Word-Wertes |
FileWrite (fh, 110, 2, TRUE) ' Schreiben eines Integer-Wertes |
FileWrite (fh, text$ , 100) ' 100 Byte als Text schreiben. ! Ist text$ länger, wird der String abgeschnitten. ! Es wird keine Textendekennung (Null) geschrieben. ! Ist text$ kürzer, wird mit Nullen aufgefüllt. |
DIM time AS DateAndTime FileWrite (fh, time, SizeOf( time)) ' Schreiben einer Struktur |
FileInsertFügt eine bestimmte Anzahl von Bytes in eine Datei ein, ohne das vorhandene Daten überschrieben werden. Die Datei wird dadurch automatisch verlängert. Der Dateizeiger wird hinter die geschriebenen Daten gesetzt.Syntax: FileInsert <fh>, <expression>, size [, signed]) Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiele: siehe FileWrite.
Spezielle Hinweise zum Speichern von File-, Handle- und Objekt-Variablen in DateienFileRead, FileWrite und FileInsert können mit File-, Handle und Objektvariablen bzw. Ausdrücken umgehen. Verwenden Sie als Datengröße die WerteSizeOf(File) (=6), SizeOf(Handle) (=6), SizeOf(Object) (=8). Es ist jedoch im Normalfall nicht sinnvoll, diese Werte in einer Datei zu speichern, da die enthaltenen Werte nur zeitlich begrenzt gültig sind.
Spezielle Hinweise zum Speichern von numerischen Werten in DateienR-BASIC kennt 3 vorzeichenlose (BYTE, WORD und DWord) und 4 vorzeichenbehaftete (INTEGER, LONGINT, WWFixed und REAL) numerische Datentypen.Um Zahlen mit diesen Datentypen sowohl in Dateien schreiben als auch aus Ihnen lesen zu können, gelten folgende Konventionen:
Lesen von numerischen Werten:
|
DIM x, z AS Real
DIM n AS Word
n = FileRead(fh, 2) ' Lesen eines Word
x = FileRead(fh, 2, TRUE) ' Lesen eines Integerwertes,
' aber speichern als Real
x = FileRead(fh, 4, TRUE) ' Lesen eines LONGINT
x = FileRead(fh, 4) ' Lesen eines DWord
z = 2.7 * FileRead(fh, 2) + FileRead(fh, 10)
|
Schreiben von numerischen Werten:Die Parameterkonventionen sind denen von FileRead analog.
Beispiele: |
DIM x AS Real
DIM n AS Word
FileWrite(fh, n, 2) ' Schreiben eines Word
FileWrite(fh, x, 2, TRUE) ' x runden und Schreiben als Integerwert
FileWrite(fh, x, 4, TRUE) ' Schreiben eines LONGINT, x vorher runden
FileWrite(fh, n, 4) ' Schreiben eines DWord, n vorher
' in DWord konvertieren
|
Tipp: Wenn Sie mehr als eine einzige numerische Variable speichern wollen ist es sinnvoll, diese in eine Struktur zu packen. Damit ersparen Sie sich auch die manuelle Typunterscheidung, da R-BASIC dies bei Strukturen automatisch macht.
^9.5 Lesen und Schreiben von TextdateienR-BASIC verfügt über Spezialbefehle zum Lesen und Schreiben von Zeilen aus Textdateien. Diese Befehle arbeiten nur mit Stringvariablen zusammen und werden in diesem Abschnitt erklärt. Universelle Lese- und Schreibefehle finden Sie im Abschnitt 9.4.FileReadLine$, FileWriteLine, FileInsertLine und FileReplaceLine sind auf Textzeilen, die durch ein Zeilenendezeichen abgeschlossen sind, spezialisiert. Das trifft für normale Textdateien zu. Zeilenendezeichen sind die ASCII-Codes 13 (Wagenrücklauf, Carriage return, CR) bzw. 10 (Zeilenvorschub, LineFeed, LF) oder eine Kombination davon, üblicherweise die Folge 13, 10 (CRLF).
Hinweis: Ein Texteditor und auch ein Text Objekt fügt häufig zur Gewährleistung der Lesbarkeit von Texten automatische (nur am Bildschirm vorhandene) Zeilenumbrüche ein. Die R-BASIC "Textzeilen" erscheinen daher als "Absätze" in einem Texteditor oder in einem Textobjekt.
FileReadLine$Liest eine Textzeile aus einer Datei. Es werden maximal so viele Zeichen gelesen, wie die zu belegende Variable aufnehmen kann. Ist die Zeile länger (d.h. es wurde keine Zeilenendekennung gelesen), so wird fileError auf -11 (LINE_TO_LONG) gesetzt. Ihr Programm kann dann entsprechend reagieren. Die fehlenden Zeichen werden nicht übergangen, das nächste FileReadLine$ liest sie ein.Syntax: <z$> = FileReadLine$(<fh> [, mode]) Die Systemvariable fileError wird gesetzt oder gelöscht. Mode-Konstanten für FileReadLine$ (RLM = ReadLine Mode)
Hinweise:
|
z$ = FileReadLine$ (fh) ' eine Zeile lesen WHILE fileError = 0 z$ = FileReadLine$(fh) ' eine Zeile lesen IF fileError <> 0 THEN Print z$ ' und ausgeben WEND z$ = FileReadLine$(fh, RLM_DONT_CHANGE) ' eine Zeile inkl. CR/LF lesen |
FileWriteLineSchreibt eine Textzeile, indem vorhandene Daten überschrieben werden. Bei Bedarf wird die Textzeile angehängt, d.h. die Datei wird verlängert.Syntax: FileWriteLine <fh>, zeile$ [, mode]) Die Systemvariable fileError wird gesetzt oder gelöscht. Mode-Konstanten für FileWriteLine, FileInsertLine, FileReplaceLine
Beispiele: |
FileWriteLine fh, "Hallo Welt" 'CRLF automatisch anhängen
FileWriteLine fh, "Hallo Welt\r",WLM_SET_TO_CRLF ''\r' (CR) durch CRLF ersetzen
FileWriteLine fh, "\r\r\r",WLM_SET_TO_CRLF '3 Leerzeilen
FileWriteLine fh, \
"Text geschrieben von R-BASIC", WLM_SET_TO_CRLF
FileWriteLine fh, "Letzte Zeile",WLM_DONT_CHANGE ' kein CRLF anhängen
|
FileInsertLineSchiebt eine Textzeile in die Datei ein. Die Datei wird dadurch verlängert.Syntax: FileInsertLine <fh>, zeile$ [, mode]) Die Systemvariable fileError wird gesetzt oder gelöscht. FileReplaceLineErsetzt eine Textzeile in einer Datei durch eine andere. Die ersetzte Zeile darf maximal 1024 Zeichen lang sein (R-BASIC Begrenzung für Strings).Syntax: FileReplaceLine <fh>, zeile$ [, mode]) Die Systemvariable fileError wird gesetzt oder gelöscht. ^9.6 Sonstige FunktionenPositionieren des DateizeigersWährend die Datei geöffnet ist, gibt es einen "Dateizeiger", der die Position bestimmt, an der Daten gelesen oder geschrieben werden. Der Zugriff auf den Dateizeiger einer Datei erfolgt über eine Variablen vom Typ FILE, die von FileOpen bzw. FileCreate geliefert wird.FileGetPosLiest die aktuelle Position des Dateizeigers aus. Der zurückgegebene Wert liegt im Bereich von 0 (Dateianfang) bis 4294967295, da Dateien maximal 4 GByte groß werden können.Syntax: <numVar> = FileGetPos (<fh>) Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiel: |
' Herausfinden, ob man schon am Dateiende ist IF FileSize(fh) = FileGetPos(fh) THEN Print "Dateiende erreicht" |
FileSetPosSetzt den Dateizeiger an eine bestimmte Position. Die folgenden File~ Operationen lesen bzw. schreiben ab dieser neuen Position.
Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiele: Setzen des Dateizeigers an den Dateianfang: |
FileSetPos fh, 0 |
|
|
FileSetPos fh, 0, TRUE |
|
|
FileSetPos fh, -100, TRUE |
|
|
FileSetPos fh, FileGetPos(fh) + 10 |
|
|
FileSetPos fh, 2 |
Tipps & Tricks:
Weitere DateioperationenFileResizeEinfügen oder Löschen von Bytes an der aktuellen Position einer Datei. Die dahinter folgenden Daten werden automatisch verschoben. Eingefügte Bytes werden mit Null initialisiert. Der Dateizeiger wird hinter die eingefügten Bytes gesetzt. FileResize eignet sich auch, um Null-Bytes an eine Datei anzufügen.Syntax: FileResize <fh>, bytesToDelete, bytesToInsert Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiele: |
FileResize fh, 200, 0 ' 200 Bytes löschen. Der Dateizeiger bleibt
' an der aktuellen Position.
FileResize fh, 0, 200 ' 200 Bytes einfügen, der Dateizeiger steht
' hinter den eingefügten Bytes.
FileResize fh, 100, 200 ' 100 Byte löschen und durch 200 Null-Bytes ersetzen.
' Die Datei wird um 100 Byte verlängert, der Dateizeiger
' wird hinter die 200 Null-Bytes gesetzt.
FileResize fh, 100, 40 ' 100 Byte löschen und durch 40 Null-Bytes ersetzen.
' Die Datei wird um 60 Byte kürzer, der Dateizeiger wird
' hinter die 40 Null-Bytes gesetzt.
FilePos fh, 0, TRUE ' Dateizeiger ans Dateiende
FileResize fh, 0, 800 ' 800 Null-Bytes anhängen
|
FileTruncateFileTruncate schneidet die Datei an der Position des aktuellen Dateizeigers ab.Syntax: FileTruncate <fh> Die Systemvariable fileError wird gesetzt oder gelöscht. Beispiel: |
! Einkürzen einer Datei auf die Länge Null, d.h. alle Daten löschen. FileSetPos fh, 0 FileTruncate fh |
FileCommitBewirkt, dass alle in Daten der Datei unverzüglich auf die Platte geschrieben werden. Das GEOS-System hält aus Performance-Gründen viele Daten oft bis zum Schließen der Datei im Speicher, d.h. die Daten kommen manchmal erst beim FileClose wirklich auf der Platte an. FileCommit ist sinnvoll, wenn mehrere Programme gleichzeitig auf die gleiche Datei zugreifen und man kann damit einem Datenverlust im Falle eines Systemabsturzes vorbeugen.Syntax: FileCommit <fh> Die Systemvariable fileError wird gesetzt oder gelöscht. ^Erweitere Konvertierfunktionen für macOS & Linux - Neue Funktionen in R-BASIC 1.02 |