VBA 6.0: Binärdaten aus Datei lesen

Hi,

ich habe ein Problem beim binären Auslesen von Daten aus einer Datei:

Als erstes Zeichen der TXT-Datei wird immer ein Leerstring „“ ausgelesen, obwohl da ein Zeichen drinsteht. Alle anderen Zeichen werden korrekt ausgelesen.

Der Datenkanal wird mittels

Open strDateiName For Binary Access Read As #1 Len = 1

geöffnet und die Daten dann per

Get #1, longZähler, strDatensatz

ausgelesen.

Habt ihr eine Idee?

Vielen Dank
Martin

Hallo Martin.

Ich hatte mal so ein Falsch-Lese-Problem, weil die Variablen (longZähler, strDatensatz) nicht als Variant deklariert waren. Das war allerdings auch für ein Array.

Kannst Du ja mal ausprobieren.

Viele Grüße
Carsten

P.S.: Du solltest Umlaute vermeiden, besser wäre „longZaehler“

P.S.: Du solltest Umlaute vermeiden, besser wäre „longZaehler“

Hallo Carsten,
wenn ich 500mal den letzten Riesenjackpot von 37 Mio gewonnen habe kaufe ich MS auf und das erste was ich machen werde ist, die alte 8.3 Dateibezeichnungsregel wieder knallhart einzuführen.
Die Leute sollen sich mal wieder nen Kopp machen über sauber strukturierte Ordnerstrukturen, dann brauchen sie nur kurze Dateinamen und Sonderzeichen schon mal gar nicht.

Aber meine Anfrage ist eine andere.
Ich müßte eine Datei als Block in eine Variable einlesen. Aber ch krieg da Pickel, weil, aus der Erinnerung, diesen Wunsch habe ich jedes Jahr vieleicht einmal, aber unter Stunden geht es nicht ab bis ich das alleine schaffe.
Von der LOgik her habe ich Input, Output, Random, access usw kapiert, und ich kann locker mit Input oder Line Input was einlesen und mit Print wieder was schreiben, aber irgendwie wirds ein Trauerspiel wenn ich mir die Hilfe zu „Open“ anschaue und dann rumprobiere *seufz*

Also, wenn du magst, mit welcher Anweisung lese ich eine Datei binär auf einen Rutsch ein?
Und wenn es da Größenbegrenzungen geben sollte, 64KB o.ä, in mehreren Schüben?
Danke ^ Gruß
Reinhard

Hallo Reinhard,

Ich müßte eine Datei als Block in eine Variable einlesen. Aber
ch krieg da Pickel, weil, aus der Erinnerung, diesen Wunsch
habe ich jedes Jahr vieleicht einmal, aber unter Stunden geht
es nicht ab bis ich das alleine schaffe.
Von der LOgik her habe ich Input, Output, Random, access usw
kapiert, und ich kann locker mit Input oder Line Input was
einlesen und mit Print wieder was schreiben, aber irgendwie
wirds ein Trauerspiel wenn ich mir die Hilfe zu „Open“
anschaue und dann rumprobiere *seufz*

hmmm, mir stellt so leichte Fragen kein Mensch. :frowning:

Zwei Varianten, ‚get‘ soll zuverlässiger arbeiten, ich habe aber keine Unterschiede feststellen können.

Private Sub Command1\_Click()
 Dim fn As String
 Dim txt As String
 Dim sz As Long
 Dim ff As Integer
 CommonDialog1.ShowOpen
 fn = CommonDialog1.FileName
 sz = FileLen(fn)
 ff = FreeFile
 Open fn For Binary As #ff
 txt = Input(sz, #ff)
 Close #ff
 RichTextBox1.Text = txt
End Sub

Private Sub Command2\_Click()
 Dim fn As String
 Dim txt As String
 Dim sz As Long
 Dim ff As Integer
 CommonDialog1.ShowOpen
 fn = CommonDialog1.FileName
 sz = FileLen(fn)
 ff = FreeFile
 txt = Space(sz)
 Open fn For Binary As #ff
 Get #ff, , txt
 Close #ff
 RichTextBox1.Text = txt
End Sub

Gruß, Rainer

1 Like

Hallo Rainer,

manchmal tut man sich entschieden leichter, wenn man Texte genauer durchliest.

txt = Space(sz)

Das Problem an „GET #“ ist, daß es genau so viele Zeichen ausliest, wie in der Variable vorgesehen sind. Wird die Variable zum Auslesen des Dateininhaltes nur deklariert, aber nicht initialisiert, dann hat sie eben die Länge Null und liest auch so viele Bytes aus. Erst nachdem ich der Variablen, falls sie einen Leerstring enthält, CHR(0) zuweise, bekommt sie die richtige Länge und kann alle weiteren Bytes korrekt auslesen.

Gestern hatte ich das auch schon in meinem Excel-Buch, weil in einem etwas anderen Kontext gebraucht, überlesen. Heute ist mir das glücklicherweise wieder eingefallen - und siehe da - es funktionierte.
Und da ich jetzt wußte, worauf es ankam, fand ich es auch in Deiner Antwort nochmal.

Danke
Martin

Hallo Reinhard.

Also, das Einlesen einer Datei auf einen Rutsch kann ich Dir nicht sagen, es sei denn, Du meinst, daß in dieser Datei ein Array gespeichert ist, das eingelesen werden soll. Das würde dann so gehen:
In einem Modul

Public MeinArray() As Variant
 
Public Type ArrayDatei
 Dim1Count As Long
 Dim2Count As Long
End Type

Sub Array\_Einlesen()
 On Error GoTo BeiNullAnfangen
 FehlerAusloeser = FileLen("C:\MeineArrayDatei.dat")
 'Wenn die Datei noch gar nicht existiert, muß an dieser
 'Stelle bereits ein Fehler ausgelöst werden, da sonst die
 'Datei erstellt wird und der Fehler dann bei ReDim auftritt,
 'was wiederum zur Folge hätte, daß die dann erstellte Datei
 'nicht mehr geschlossen wird, und das führt dann wiederum
 'dazu, daß beim Auslesen die Fehlermeldung "Datei bereits geöffnet" kommt
 '(und diesen Fehler habe ich wirklich seeeeeehr lange gesucht).
 FileArray = FreeFile
 Open "C:\MeineArrayDatei.dat" For Binary As FileArray
 Get FileArray, , ArrayDatei.Dim1Count 'Liest die Anzahl der Einträge in der 1. Array-Dimension
 Get FileArray, , ArrayDatei.Dim2Count 'Liest die Anzahl der Einträge in der 2. Array-Dimension
 ReDim MeinArray(0 To ArrayDatei.Dim1Count - 1, 0 to ArrayDatei.Dim2Count - 1)
 Get FileArray, , MeinArray
 Close FileArray
 Exit Sub
 
BeiNullAnfangen:
 With ArrayDatei
 .Dim1Count = 0 'Ist ja eigentlich sowieso 0, aber es geht ja um's Prinzip
 .Dim2Count = 0
 End With
End Sub
 
Sub Array\_Auslesen()
 FileArray = FreeFile
 Open "C:\MeineArrayDatei.dat" For Binary As FileArray
 Put FileArray, , ArrayDatei.Dim1Count
 Put FileArray, , ArrayDatei.Dim2Count
 Put FileArray, , MeinArray
 Close FileArray
End Sub

Du hast sicher gemerkt, daß ich Option Explicit nicht verwende.

Viele Grüße
Carsten