Запись в случайный файл записывает неверную длину файла только для первой записи - PullRequest
0 голосов
/ 07 декабря 2011

Примечание. Я переписал этот вопрос с нуля, чтобы упростить проблему ...

Следующая функция записывает запись в двоичный файл:

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

Обратите внимание, что Len(EmpRec) = 6 при пошаговом выполнении этого кода

Если я вызываю функцию и записываю одну запись - она ​​записывает только 4 байта:

Call WriteTestRecord(1) 'длина файла4 байта

Если я вызываю функцию и записываю более одной записи - она ​​записывает (RecCount*6) - 2 байтов:

Call WriteTestRecord(10) 'длина файла составляет 58 байтов

Это связано с тем, что в моем типе есть строка нефиксированной длины, но почему первая запись отличается от всех остальных?

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Дело не в том, что первая запись неверна, а в том, что последняя запись неверна.

Это можно увидеть, если установить «Доступно в True» перед каждой записью и посмотреть файл.*

Ваш UDT составляет всего 4 байта, поэтому при первой записи у вас есть 4 байта в файле.Но затем, когда вы пишете 2-ю запись, VB сначала заполняет Rec # 1 в файле нулями до 6-байтовой длины, которую вы указали в Open.Затем он записывает 4-байтовую запись (rec # 2).Этот процесс повторяется при каждой записи.Это всегда последняя короткая запись.

Интересно то, что Close также не дополняет последнюю запись размером от 4 до 6 байтов.

0 голосов
/ 08 декабря 2011

Строки переменной длины VB6 являются указателями на структуры BSTR.Согласно спецификации языка они могут быть NULL.Это означает, что значение указателя в определении типа будет нулевым.Я вижу, как VB6 делает что-то вроде пропуска этих байтов при записи.

Как вы упоминаете в отредактированном вопросе, правильный ответ - использовать строки фиксированной длины, если вы собираетесь записать структуру вфайл произвольного доступа.

...