Scrivere file casuali scrive una lunghezza errata del file solo per il primo record
-
29-10-2019 - |
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?
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.