GET (Datei)

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » G » GET (Datei)

Syntax: GET #Dateinummer, [Position], Variable [, Menge [, Gelesen] ]
Typ: Anweisung/Funktion
Kategorie: Datei

GET liest Daten aus einer Datei, die im BINARY- oder RANDOM-Modus geöffnet wurde.

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:

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 einen Record 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:

Unterschiede zu früheren Versionen von FreeBASIC:

Siehe auch:
GET (Grafik), OPEN, BINARY, RANDOM, PUT #, Dateien (Files)