VBA 1 лишний байт при записи в бинарный файл
При использовании оператора Put возникает странная ситуация - размер записываемого в файл массива 10 байт, однако в конец файла всегда добавляется 1 нулевой байт. Как это исправить?
Dim arr(10) As Byte
Open strFilePath For Binary Lock Write As #1
Put #1, , arr
Close #1
Ответы (2 шт):
Проблема, которую вы описываете, связана с тем, что оператор Put в Visual Basic добавляет нулевой байт в конец файла при записи массива, чтобы обозначить его конец. Это поведение по умолчанию для оператора Put в режиме бинарной записи.
Если вы хотите избежать добавления нулевого байта в конец файла, вам нужно использовать другие методы записи, такие как использование функций FilePut или PutObject. Ниже приведен пример использования функции FilePut для записи массива байтов без добавления нулевого байта в конец файла:
Dim arr(10) As Byte
Open strFilePath For Binary Lock Write As #1
FilePut(1, arr)
Close #1
При использовании FilePut нулевой байт не будет добавлен в конец файла, и файл будет содержать только указанные вами 10 байт.
Никаких лишних нулей Put не пишет. Здесь дело в Option Base 0 по умолчанию см. здесь.
Если явно не указать нижнюю границу массива Dim arr(10) As Byte при Option Base 0 (по умолчанию), то объявится массив от 0 до 10, т.е. из 11 элементов.
Чтобы задать 10 элементов при верхней границе 10, явно определите Option Base 1 или укажите нижнюю и верхнюю границы при объявлении массива Dim arr(1 To 10) As Byte.
Ну или Dim arr(9) As Byte - будет также 10 байт от 0 до 9.
Option Base 1
Sub test1()
strFilePath = "c:\test\binary.bin"
Dim arr(1 To 10) As Byte
Dim f, i
For i = LBound(arr) To UBound(arr)
arr(i) = i
Next
f = FreeFile
Open strFilePath For Binary Lock Write As f
Put f, , arr
Close f
End Sub
Примечание. Для нахождения свободного номера файла можно использовать функцию FreeFile
