Referenz - GET (Datei)
Syntax: GET #Dateinummer, [Position], Variable [, Menge [, Gelesen] ]
Typ: Anweisung/Funktion
Kategorie: Dateien
GET liest Daten aus einer Datei, die im BINARY- oder RANDOM-Modus geöffnet wurde.
- '#Dateinummer' ist die Nummer, die beim Öffnen der Datei mit OPEN zugewiesen wurde.
- 'Position' ist die Position innerhalb der Datei, von der gelesen werden soll. Für BINARY-Dateien ist es die Nummer des Bytes, für RANDOM-Dateien ist es die Nummer des Datensatzes. Wird dieser Parameter ausgelassen, liest FreeBASIC von der Position des Dateizeigers. Diese ist abhängig von den letzten Lese-/Schreibzugriffen auf die Datei und von der SEEK-Anweisung. Direkt nach dem Öffnen ist der Dateizeiger immer auf der ersten Stelle in der Datei.
- 'Variable' ist ein Bezeichner, in dem der eingelesene Wert gespeichert werden soll. Dies kann eine einfache Variable, ein Array oder ein UDT sein.
- 'Menge' wird eingesetzt, sobald die Daten in einen ALLOCATE-Puffer eingelesen werden sollen. Dadurch wird GET mitgeteilt, wie viele Speicherstellen eingelesen werden sollen. Gelesen werden Menge*SIZEOF(Puffer_Datentyp) Bytes. Wird 'Menge' ausgelasen, nimmt FreeBASIC automatisch 1 an. Es wird also immer eine ganze Speicherstelle gelesen (entspricht SIZEOF(DatenPufferTyp) Bytes, also z. B. 4 Bytes bei einem INTEGER PTR). Bei anderen Datentypen als ALLOCATE-Datenpuffern wird der Parameter 'Menge' ignoriert.
- 'Gelesen' enthält die Anzahl der tatsächlich gelesenen Bytes. Damit kann überprüft werden, ob versucht wurde, hinter dem Dateiende zu lesen.
- Wird GET als Funktion eingesetzt, ist der Rückgabewert eine der FreeBASIC-Fehlernummern. In diesem Fall müssen die Parameter in Klammern gesetzt werden; die Syntax lautet also:
Variable = GET (#Dateinummer, [Position], Variable [, Menge [, Gelesen] ])
Da GET an jeder beliebigen Stelle einer beliebigen Datei ein einzelnes Byte oder einen beliebig langen String einlesen kann, ist es möglich, GET sehr vielseitig zu nutzen.
Im BINARY-Modus richtet sich die Anzahl der einzulesenden Bytes nach dem Datentyp der Variable, in die gelesen wird. Sie lässt sich - außer für Strings variabler Länge - über SIZEOF ermitteln:
- BYTE und UBYTE - 1 Byte (8 bit)
- SHORT und USHORT - 2 Byte (16 bit)
- INTEGER, UINTEGER, LONG und ULONG - 4 Bytes (32 bit)
- LONGINT und ULONGINT - 8 Bytes (64 bit)
- STRINGs (fester und variabler Länge) - lässt sich mit LEN ermitteln
- ZSTRINGs (fester Länge) - gelesen werden SIZEOF(ZstringVariable) - 1 Bytes. Ein Byte wird als Terminierungs-Byte benötigt.
- ZSTRING PTR - werden wie ALLOCATE-Puffer behandelt (siehe unten).
- WSTRINGs (fester Länge) - gelesen werden wie bei ZSTRINGs SIZEOF(WstringVariable) - 1 Bytes. Ein Byte wird als Terminierungs-Byte benötigt.
- ALLOCATE-Puffer - Der Parameter 'Menge' gibt an, wie viele Bytes gelesen werden. Achten Sie darauf, dass genügend Speicherplatz reserviert wurde!
- Arrays - Indexzahl * SIZEOF(Datentyp)
- UDTs - lässt sich mit SIZEOF ermitteln
Im RANDOM-Modus wird jeweils ein Datensatz eingelesen. Die Länge eines Satzes wird bereits beim Öffnen der Datei festgelegt. Siehe dazu OPEN. RANDOM-Daten werden kaum verwendet, da der BINARY-Modus vielseitigere Zugriffsmöglichkeiten bietet.
Wenn das Dateiende erreicht wird, bevor die gewünschte Datenmenge eingelesen wurde, wird der Lesevorgang einfach vorzeitig abgebrochen. Die Stellen des Lesepuffers ('Variable'), die nicht aus der Datei befüllt werden können, erhalten den Wert 0, unabhängig davon, welcher Wert zuvor gespeichert war.
Beispiel 1:
Drei mal vier Bytes aus der Datei 'file.ext' einlesen:
DIM FixedLenBuffer AS STRING * 4
DIM VarLenBuffer AS STRING
DIM IntegerBuffer AS INTEGER
VarLenBuffer = SPACE(4)
Dim As Integer f = Freefile
Open "file.ext" For Binary As #f
Get #f, , FixedLenBuffer
Get #f, 1, VarLenBuffer
Get #f, 1, IntegerBuffer
Close #f
Wie Sie sehen, müssen Sie einen String variabler Länge zuerst mit einem temporären String vorbelegen, damit festgelegt ist, welche Länge der einzulesende Datensatz haben soll. GET wird die Länge eines Strings variabler Länge nicht verändern. Dies ist auch dann der Fall, wenn der Parameter 'Menge' benutzt wird.
Um ganze Arrays oder UDTs zu lesen, geben Sie einfach nur den Bezeichner ohne Index bzw. Verweis auf ein Attribut an.
Beispiel 2:
Type UDT
a As Integer
b As Double
c As String * 5
End Type
Dim inpArray(5) As Integer
Dim inpUDT As UDT
Dim As Integer f = Freefile
Open "file.ext" For Binary As #f
Get #f, , inpArray()
Get #f, , inpUDT
Close #f
In inpArray werden 6 * 4 = 20 Bytes eingelesen; 6 ist die Anzahl der Indizes (von 0 bis 5), 4 ist die Länge einer Integer-Variable. In inpUDT werden LEN(UDT) = 20 Bytes eingelesen. Es ist die Summe der Längen der Records des UDTs. Beachten Sie an dieser Stelle auch das Padding von 4 (siehe TYPE (UDT)).
Bei der Verwendung von Datenpuffern, deren Pointer angegeben ist, verwenden Sie die Pointer-Dereferenzierung
*Pointer
oder
Pointer[index]
Außerdem müssen Sie angeben, wie viele Bytes gelesen werden sollen. Dazu dient der Parameter 'Menge'.
Beispiel 3:
Dim As Integer f = Freefile
Open "file.ext" For Binary As #f
Dim x As Byte Ptr
x = Allocate(8)
Get #f, 1, *x , 4 ' 4 Bytes in die ersten vier Speicherstellen lesen
Get #f, 5, x[4], 4 ' 4 Bytes in die nächsten vier Speicherstellen lesen
DeAllocate x
Close #f
Achten Sie bei der Verwendung von GET sehr genau auf die Datentypen!
Beispiel 4:
Dim v1 As Byte, v2 As String * 2
Dim f As integer
v1 = 33
v2 = "33"
f = FreeFile
Open "file.ext" For Binary As #f
Put #f, , v1
Put #f, , v2
Close #f
Open "file.ext" For Binary As #f
Get #f, , v2
Get #f, , v1
Close #f
Print v1, v2
Sleep
Ausgabe:
51 !3
Wie Sie sehen, wird in die Datei beim ersten Zugriff zuerst ein BYTE-Wert und anschließend ein 2-Byte-STRING geschrieben. Beim zweiten Zugriff wird zuerst ein 2-Byte-STRING und anschließend ein BYTE-Wert eingelesen. Ergebnis ist, dass nicht - wie anzunehmen - wieder zwei mal die Ausgabe '33' erfolgt, sondern nur Datenmüll auf dem Bildschirm erscheint. Obwohl die Informationen fehlerfrei gelesen wurden, kann mit den Informationen nicht gearbeitet werden, da sie nach dem Lesen auf die falsche Art und Weise behandelt werden. Werden beim Lesezugriff die beiden GET-Zeilen vertauscht, so erfolgt die korrekte Ausgabe:
33 33
Die Ursache hierfür liegt darin, dass im BINARY- und RANDOM-Modus (mit denen GET und PUT ja arbeiten) die Daten nicht in einem für Menschen lesbaren Format abgelegt werden, sondern binär behandelt werden, d. h. so geschrieben werden, wie sie vom Prozessor behandelt werden. Hierbei existieren Unterschiede zwischen der Behandlungsweise von Zeichenketten (des STRINGs) und Zahlen (des BYTE-Werts).
Unterschiede zu QB:
- GET kann in FreeBASIC auch als Funktion eingesetzt werden.
- In FreeBASIC können ganze Arrays und UDTs eingelesen werden. Auch die Verwendung von ALLLOCATE-Datenpuffern ist möglich.
- Mit dem Parameter 'Gelesen' kann in FreeBASIC die tatsächlich gelesene Datenmenge bestimmt werden.
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.20 steht der fünfte Parameter 'Gelesen' zur Verfügung, um die Anzahl der tatsächlich gelesenen Byte zu bestimmen.
- Seit FreeBASIC v0.13 kann GET als Funktion eingesetzt werden
- Seit FreeBASIC v0.10 können ganze Arrays gelesen werden.
Siehe auch:
GET (Grafik), OPEN, BINARY, RANDOM, PUT #, Dateien (Files)
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|