Как прочитать из Binary файла такие данные (VB 6.0) -
заголовок (комментарии - 80 байт),
затем число 4 байта интерпретируются как long integer,
а после этого ряд повторяющихся групп записей по 50 байт:
4 группы по 3 числа (4x12 байт = 48, каждые 4 байта интерпретируются как число float) + разделитель 2 байта.
Хм... Ну смотря для чего это надо. Просто тупо прочитать из Binary, то сперва заголовок как динамический массив 80 as Byte, затем один long, повторяющиеся группы также можно читать как (50) as Byte, только их число знать надо, если это фиксированная структура - лучше через нее, ну и массив из 12 single, или 4 массива по 3 single
Сказал бы конкретнее - можно было бы наклепать код.
Это файл с данными трехмерной фасетированной поверхности (состоит из треугольных граней, которых может ыть довольно много). Первое число long - количество треугольников.
Повторяющиеся записи по 50 байт:
- информация о нормали к треугольной грани (первая группа из 3-х чисел);
- координаты вершин треугольника (еще 3 группы чисел float);
- Затем разделитель (два байта, судя по образцу файла - 2 пробела).
Лучше, видимо, сначала прочитать данные в массив (для увеличения скорости), а затем разобрать.
См. топик "VС++ Загрузка массива структур", там на сях, но переделать не сложно.
P.S. Уже не первый раз натыкаюсь на термин "Бинарный файл" - народ, вам не кажется, что слово "бинарный" тут вообще никаким боком не лезет?.. Файл, он и в Африке файл - зачем его обзывать-то?
P.S.S. Это случаем не *.3DS формат?
Разбор может оказаться геморнее чем чтение (для твоего примера). Просто скажи че из этих данных тебе конкретно нужно. Если все - подумай над постом N1, все жутко просто, даже код клепать не хоцца. И вынеси все это дело в отдельную структуру, чтоб самому гемора меньше было.
См. топик "VС++ Загрузка массива структур", там на сях, но переделать не сложно.
Нахрена? Это задачка на пять строк, зачем тут С++ приплетать. Тем более что там тема совсем другая
Уже не первый раз натыкаюсь на термин "Бинарный файл" - народ, вам не кажется, что слово "бинарный" тут вообще никаким боком не лезет?.. Файл, он и в Африке файл - зачем его обзывать-то?
Под "Бинарным" файлом подразумевается файл открытый for Binary. Надеюсь, от Random, Input, Append и т.п. отличить смогёшь
Нахрена? Это задачка на пять строк, зачем тут С++ приплетать.
Зачем приплетать Си? А кто предлагал приплетать Си? Я предлагал переделать сишный код из вышеуказанного топа под VB, не более.
Тем более что там тема совсем другая
Там надо было прочитать файл со студентами, а здесь
файл с данными трехмерной фасетированной поверхности
Где тут другая тема? Те же структуры в файле. Создаёшь структуру по тем данным, что привёл автор, создаёшь массив этого типа размером под файл, читаешь файл в буфер, делаешь CopyMemory из буфера в массив и всё.
Под "Бинарным" файлом подразумевается файл открытый for Binary
Ну давайте ещё файл открытый For Binary Read называть "бинарным читательским", чтобы окончательно всё запутать.
А файл записанный For Output уже не бинарный что ли? А какой - текстовый? И открыть его For Binary Read уже нельзя?
Короче For Binary - это метод открытия файла. А бинарный файл - это двоичный файл. А поскольку сейчас все носители хранят инфу в двоичном виде, то не-двоичных файлов просто не существует.
Надеюсь, от Random, Input, Append и т.п. отличить смогёшь
Вообще нет - не смогу. К примеру, я блокнотом создал файл и хз как там его блокнот открывал. Подозреваю, что Binary, но утверждать не буду, т.к. не знаю как ещё на сях открыть файл кроме как fopen(..."r" - что есть эквивалент Binary.
Попробовал вариант N1 - прочитал комментарии и число треугольных граней. А как можно преобразовать массив байтов в число float (single в vb6)?
Dim lFileNum As Long
lFileNum = FreeFile
Open App.Path & "\" & "test_binary" For Binary As #lFileNum
ReDim byComment(0 To 79) As Byte
Get #lFileNum, , byComment
Dim strComment As String
Dim i As Integer
For i = LBound(bycomment) To UBound(bycomment)
strComment = strComment & Chr(bycomment(i))
Next i
strComment = Trim(strComment)
Dim lFacetNum As Long
ReDim byFacetNum(0 To 3) As Byte
ух.... и я ворвусь ))))
Бинари файл - который записан не open for output, а open for binary/random. Записать банарные данные (кусок памяти например) for output низя, хотя можно, но их потом нельзя будет востановить в нужный кусок памяти. А тема действительно довольна проста... Но мало относится к "VC++ Загрузка массива структур" там у меня была трабла именно с чтением МАССИВА структур, сходство лишь что там надо читать с файла и тута Ну ладно, попробуй и я код наваять...
Private Type FileData
Comment As String * 80 'заголовок (комментарии - 80 байт)
HZ_Number As Single 'затем число 4 байта интерпретируются как long integer
byFacetNum(3) As Byte '4 группы по 3 числа ...
End Type
Private Sub Form_Load()
Me.AutoRedraw = True
Const FileName As String = "C:\myfile.dat"
Dim fd As FileData
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Any, ByVal Length As Long)
...
floatNum = -2,280134E-03 ... 135,4655
С Neco даже спорить не буду, сразу видно что человеку пофлудить захотелось.
Я лишь отвечал на твой вопрос "нахрена" - на мой взгляд оба топа - одно и то же. Там массив, здесь одно значение (что есть массив с Ubound=0) + массив, вот и сравнивай.
Единственное в чём я был не прав, так это, что тут нужен CopyMemory - всё доступно стандартными средствами (как и показывал Hacker).
Только я свой код приведу так, как я понял автора - сначала следует заголовок+число (я так думаю, кол-во полигонов), а потом сами полигоны - ряд повторяющихся групп записей по 50 байт:
Option Explicit
Private Type TriangleHeader
comment As String * 80 ' comment = 80
num As Long ' num of trngls = 4
End Type
Private Type Triangle ' multiple group of 50 bytes
gr1(2) As Single '
gr2(2) As Single ' 4 grp of 3 digit
gr3(2) As Single '
gr4(2) As Single '
separator As Integer ' + separator = 2
End Type
Private Sub Form_Load()
Dim body() As Triangle
Dim hdr As TriangleHeader
hdr.comment = Left$("Comment", 80)
hdr.num = 5
ReDim body(hdr.num - 1)
body(0).gr1(0) = 12.5
body(hdr.num - 1).gr4(2) = 13.3
Dim i As Long
Dim nxt_pos As Long
nxt_pos = Len(hdr)
Open "d:\1.trngl" For Binary Access Write As #1
Put #1, 1, hdr
Put #1, Len(hdr) + 1, body
Close #1
' ---------------------------------
Dim r_hdr As TriangleHeader
Dim r_body() As Triangle
Open "d:\1.trngl" For Binary Access Read As #1
If LOF(1) > Len(r_hdr) Then
Get #1, , r_hdr
If r_hdr.num > 0 Then
ReDim r_body(r_hdr.num - 1)
Get #1, Len(r_hdr) + 1, r_body
End If
End If
Close #1
Debug.Print r_hdr.comment
If r_hdr.num > 0 Then
Debug.Print r_body(0).gr1(0)
Debug.Print r_body(r_hdr.num - 1).gr4(2)
End If
End Sub
Это бинарный вариант формата stl (самый простой выриант - ASCII - там все пишется открытым текстом, но размер в несколько раз больше). Пишут его, как минимум, системы CAD. Применяют в системах быстрого прототипирования (распечатка 3D - из пластмассы и т.п.) и для обмена 3D моделями.
Цвет и текстуры в этом формате, похоже, не поддерживаются.