Domanda

Nota: ho riscritto questa domanda da zero per semplificare il problema ...

La seguente funzione scrive un record in un file binario:

Public Type TestRecord
    Available As Boolean
    Inidcator As String
End Type

Private Sub WriteTestRecord(ByVal RecCount As Integer)

    Dim Fn As Integer, CN As Integer
    Dim filename As String
    Dim EmpRec As TestRecord
    Dim clk() As TestRecord
    ReDim clk(1 To RecCount)

    Debug.Print Len(EmpRec)

    filename = "C:\TestRecFile.bin"

    If Len(Dir(filename)) > 0 Then Kill filename

    Fn = FreeFile
    Open filename For Random As #Fn Len = Len(EmpRec)
    For CN = 1 To RecCount
        EmpRec = clk(CN)
        Put #Fn, , EmpRec
    Next CN
    Close #Fn

End Sub

Notare che Len(EmpRec) = 6 Quando si passa attraverso questo codice

Se chiamo la funzione e scrivo un record, scrive solo 4 byte:

Call WriteTestRecord(1) 'La lunghezza del file è 4 byte

Se chiamo la funzione e scrivo più di un record, scrive (RecCount*6) - 2 byte:

Call WriteTestRecord(10) 'La lunghezza del file è 58 byte

Questo è causato dal fatto che ho una stringa di lunghezza non fissa nel mio tipo, ma perché il primo record è una lunghezza diversa rispetto a tutti gli altri?

È stato utile?

Soluzione

Non è che il primo record THR sia sbagliato, è che l'ultimo record è sbagliato.

Puoi vederlo se impostato a disposizione di True poco prima di ogni scrittura e guarda il file.

Il tuo UDT è solo 4 byte, quindi nella prima scrittura hai 4 byte nel file. Ma poi quando si scrive il secondo record, VB viene prima imbottito REC#1 nel file con null alla lunghezza di 6 byte che hai fornito all'aperto. Quindi scrive il record a 4 byte (Rec #2). Questo processo si ripete su ogni scrittura. È sempre l'ultimo record che è breve.

Ciò che è interessante è che la chiusura non regala anche l'ultimo record di 4 byte fino a 6 byte.

Altri suggerimenti

Le stringhe di lunghezza variabile VB6 sono puntatori alle strutture BSTR. Secondo le specifiche linguistiche, possono essere nulli. Ciò significa che il valore del puntatore nella definizione del tipo sarebbe zero. Vedo VB6 fare qualcosa come saltare quei byte quando lo scrivo.

Come menzionato nella tua domanda modificata, la risposta corretta è utilizzare stringhe a lunghezza fissa se hai intenzione di scrivere la struttura su un file di accesso casuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top