Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - GET (Datei)

Referenz-Navigation

 

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

GET liest Daten aus einer Datei, die im BefehlsreferenzeintragBINARY- oder BefehlsreferenzeintragRANDOM-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 BefehlsreferenzeintragBINARY-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 BefehlsreferenzeintragSIZEOF ermitteln:

Im BefehlsreferenzeintragRANDOM-Modus wird jeweils ein Datensatz eingelesen. Die Länge eines Satzes wird bereits beim Öffnen der Datei festgelegt. Siehe dazu BefehlsreferenzeintragOPEN. RANDOM-Daten werden kaum verwendet, da der BefehlsreferenzeintragBINARY-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 BefehlsreferenzeintragUDTs 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 BefehlsreferenzeintragTYPE (UDT)).

Bei der Verwendung von Datenpuffern, deren BefehlsreferenzeintragPointer angegeben ist, verwenden Sie die BefehlsreferenzeintragPointer-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 BefehlsreferenzeintragBINARY- und BefehlsreferenzeintragRANDOM-Modus (mit denen GET und BefehlsreferenzeintragPUT 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:
BefehlsreferenzeintragGET (Grafik), BefehlsreferenzeintragOPEN, BefehlsreferenzeintragBINARY, BefehlsreferenzeintragRANDOM, BefehlsreferenzeintragPUT #, BefehlsreferenzeintragDateien (Files)


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 29.07.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 05.08.2020 von Redakteurnemored gespeichert.
  Versionen Versionen