Also, Binary geht schon erstmal. Wichtig: Dieses Konstrukt funktioniert (logischerweise) nur in R6. Für R5 muss ich mir noch was ausdenken, das es den Datentype Byte dort ja nicht gibt und Integer immer dann scheitert, wenn die FileLen ungerade ist.
Sub Click(Source As Button)
Dim iFileNum As Integer
Dim szFileName As String
Dim iPosition As Integer
Dim szResult As String
Dim szChar As String
Dim iByte As Byte
iPosition = 1
iFileNum = Freefile ()
szFileName = "c:\tmp\0test.txt"
Open szFileName For Binary As #iFileNum
Do Until Eof (iFileNum)
Get iFileNum, , iByte
szResult = szResult & Chr$ (iByte)
iPosition = iPosition + 1
Loop
Close iFileNum
Msgbox szResult
End Sub
Bernhard
Mit List und Tücke und auf Umwegen kommt man doch ans Ziel - auch unter R5 ;D
Hier ein Beispiel, wie man Open For Binary auch byteweise unter R5 hinbekommt:
Sub Click(Source As Button)
Dim iFileNum As Integer
Dim szFileName As String
Dim iPosition As Integer
Dim szResult As String
Dim iRead As Integer
Dim iResult As Integer
iFileNum = Freefile ()
szFileName = "c:\tmp\0-test5.txt"
Open szFileName For Binary As #iFileNum
iPosition = 1
If Eof (iFileNum) Then Exit Sub 'File does not exist or is empty !
Do Until Eof (iFileNum)
Get #iFileNum, iPosition, iRead
iResult = iRead And 255
szResult = szResult & Chr$ (iResult)
iPosition = iPosition + 1
Loop
iResult = (iRead And 65280) / 256
szResult = szResult & Chr$ (iResult)
Close iFileNum
Msgbox szResult
End Sub
Zur jeweiligen Verarbeitung steht das empfangene Byte in der Integer-Variablen iResult - das Zusammenschnüren des Ergebnisses im String szResult dient lediglich der Demonstration / Visualisierung. Der Trick besteht einfach darin, dass im Binary-Modus immer soviel Zeichen eingelesen werden, wie die für Get vorgesehene Variable von Hause aus verbraucht. Dummerweise bietet LS in R5 keinen Ein-Byte-Variablentyp wie R6 mit Byte. Also lesen wir eben immer zwei Byte in eine Integer-Variable ein und holen uns das interessierende Lower - bzw. am Ende Higher Byte heraus.
Bernhard
So, hier ein rasch zusammegeklöppelter "Proof of concept", ohne Struktur, ohne Errorhandling und was sonst noch dazu kommt, zeigt einfach das Prinzip und lässt sich auch ausprobieren:
Type recorddata
anInteger As Integer
aDouble As Double
aString10 As String*10
aString15 As String*15
End Type
Sub WriteData
Dim filenum As Integer
Dim Record As RecordData
filenum = Freefile
Open "testfile.dta" For Random Access Write As fileNum Len = Len(Record)
record.anInteger=1
record.aDouble=10.456
record.aString10="1st Rec"
record.aString15="1st String 15"
Put #fileNum, , record
record.anInteger= 2
record.aDouble=3.15432
record.aString10="2nd Record"
record.aString15="2nd String 15"
Put #fileNum, , record
record.anInteger=3
record.aDouble=1.45612342d15
record.aString10="3rd Record"
record.aString15="3rd String 15"
Put #fileNum, , record
Close filenum
End Sub
Sub ReadData
Dim filenum As Integer
Dim Record As RecordData
filenum = Freefile
Open "testfile.dta" For Random Access Read As fileNum Len = Len(Record)
Do While Not Eof(filenum)
Get #fileNum, , record
Loop
Close filenum
End Sub
Daraus lässt sich jetzt under Anpassung des Record-Types (im Falle von DTA durchgängig mit Fixed-Length Strings) der DTA-Access problemlos realisieren.