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
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
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.
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
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.
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.