Re: Daten schreiben in txt-File

From: Peter Götz (gssg_nospam_at_t-online.de)
Date: 08/23/04


Date: Mon, 23 Aug 2004 11:46:43 +0200

Hallo Ahmed,

> Eine Frage zum Abschluss. Wenn meine Strukturvariable 2 Integer-Werte
> beinhaltet und diese per Random-Zugriff und einer Put-Anweisung erstellt
> wurde, können diese dann ausgelesen werden ?

Ja, natürlich können sie ausgelesen werden.
Die Get-Anweisung beim Zugriff auf eine solche Datei liest die Daten ja
auch.
Die beiden Integerwerte werden ganz einfach als jeweils 2 Byte pro Integer
gespeichert und aus diesen 2 Bytes lässt sich ohne grossen Aufwand der
jeweilige Integerwert ermitteln, wenn man weiss, dass Windows diese
Integerwerte in Little-Endian-Anordnung speichert.

Wenn Du Dir einen solchen Integerwert in hexadezimaler Schreibweise
anschaust, siehst Du sofort die beiden Bytes

    debug.Print hex$(23589) --> 5C25

Das niederwertige Byte hat also den Wert &h25 (dezimal 37)
das hochwertige Byte hat den Wert &h5C (dezimal 92)

Windows speichert solche Werte im "Little-Endian"-Format. Das heisst zuerst
kommt das niederwertige Byte und dann das höherwertige Byte.
Aus 5C25 wird also 255C.
Beim Lesen musst Du die beiden Bytes einfach nur wieder vertauschen und zu
einem Wert zusammensetzen.

Wenn Du Dir nach Ausführung des nachfolgenden Programmbeispiels den Inhalt
des Bytearrays mal im Überwachungsfenster anschaust, dann siehst Du in den
Bytes 2 und 3 wieder die Werte 37 (&h25) und 92 (&h5).

Schau Dir mal das nachfolgende Beispiel an.
Mit einem Klick auf die Form wird zuerst im Modus "Random" ein Datensatz in
die Datei geschrieben.
Anschliessend wird die Datei im Modus "Binary" geöffnet und der Inhalt der
Datei in ein ByteArray eingelesen.
Anschliessend werden aus dem ByteArray die beiden Integerwerte und der Text
ausgelesen.

' /// Beginn Code Form1
Option Explicit
    Private bArray() As Byte
    Private strFile As String

    Private Type MyType
        Wert1 As Integer
        Wert2 As Integer
        Text As String * 12
    End Type

Private Sub WriteFile()
    Dim FN As Integer
    Dim MT As MyType

    On Error Resume Next
    Kill strFile
    On Error GoTo 0

    FN = FreeFile
    Open strFile For Random As #FN

    MT.Wert1 = 123
    MT.Wert2 = 23589
    MT.Text = "abcdefghijkl"

    Put #FN, , MT

    Close #FN
End Sub

Private Sub ReadFile()
    Dim i As Long
    Dim k As Long
    Dim intBuffer As Integer
    Dim FN As Integer
    Dim strBuffer As String

    FN = FreeFile
    Open strFile For Binary As #FN
    ReDim bArray(LOF(FN) - 1)

    Get #FN, , bArray

    Close #FN

    ' Integerwert Wert1 aus Array lesen
    intBuffer = "&H" & Hex$(bArray(1)) & Hex$(bArray(0))
    strBuffer = strBuffer & CStr(intBuffer) & " "

    ' Integerwert Wert2 aus Array lesen
    intBuffer = "&H" & Hex$(bArray(3)) & Hex$(bArray(2))
    strBuffer = strBuffer & CStr(intBuffer) & " "

    ' Text Byteweise lesen
    For i = 4 To 15
        strBuffer = strBuffer & Chr$(bArray(i))
    Next i

    MsgBox "Satz gelesen:" & vbCrLf & _
                  strBuffer, vbInformation

End Sub

Private Sub Form_Click()
    WriteFile
    MsgBox "Datei " & strFile & " wurde geschrieben" & _
                  vbCrLf & "und wird jetzt gelesen.", vbInformation

    ReadFile
End Sub

Private Sub Form_Load()
    strFile = "D:\R_Test.dat"
End Sub

' \\\ Ende Code

Hat sich nun der Aha-Effekt eingestellt?
Wenn der Satzaufbau einer solchen Datei bekannt ist, dann ist es auch kein
Problem mehr die einzelnen Bytes in dieser Datei richtig zu interpretieren.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tips u. Beispielprogrammen)



Relevant Pages

  • =?iso-8859-1?Q?Re:_Dateien_zusammenf=FChren?=
    ... Dim wbErgebnis As Workbook ... Datei = Application.GetOpenFilename(_ ... If Not IsArrayThen ... If Datei = False Then Exit Sub ...
    (microsoft.public.de.excel)
  • Re: Excel in CSV automatisiert
    ... in Geplante Tasks das Programm und die Datei angeben ... Private Sub Workbook_Open ... Dim Bereich As Object, Zeile As Object, Zelle As Object ... Dim strTemp As String ...
    (microsoft.public.de.excel)
  • Re: User mit schreibenden Zugriff in Tabelle schreiben
    ... Private Sub Workbook_Open ... Dim TextHinweis As String ... Dim intFileNr As Integer ... Falls ja, Msgbox "Datei wird verwendet", falls nein: ...
    (microsoft.public.de.excel)
  • Re: Probleme mit dem Speichern und Speichern unter Dialogen
    ... Eine Datei soll unter einem ganz bestimmten Dateinamen gespeichert ... Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, ... Dim Name1 As String ...
    (microsoft.public.de.excel)
  • Project Error
    ... Private Declare Sub Sleep Lib "Kernel32" ... Dim strDataSrc As String ...
    (microsoft.public.vb.bugs)