Страница: 1 |
Страница: 1 |
Вопрос: Чтение бинарника (Fortran vs VB.Net)
Добавлено: 11.03.11 14:53
Автор вопроса:
Markus
Добрый день,
У меня есть бинарный файл и код для его чтения написанный на фортране.
Мне нужно сделать читалку на языке VB.net.
Пожалуйста помогите.
Вот код на фортране-
program xxx
implicit none
real*4 time
integer, parameter :: NMAX = 10000
integer istat, iBlocks, i
integer ntot, model, nrun, nk
real*4 as(30), bodys(NMAX), xs(3, NMAX), vs(3, NMAX)
character*40 sFileName
integer name(NMAX)
call GetArg(1, sFileName)
OPEN (UNIT=3,STATUS='OLD',FORM='UNFORMATTED',FILE=sFileName)
istat = 0
iBlocks = 0
do while (istat.eq.0)
read(unit=3, iostat = istat) ntot, model, nrun, nk
if (istat.ne.0) cycle
read(unit=3, iostat = istat) as(1:nk), bodys(1:ntot), &
xs(1:3,1:ntot), vs(1:3,1:ntot),name(1:ntot)
!---->Data processing goes here
iBlocks = iBlocks + 1
enddo
close(3)
end program xxxx
Вот что делаю я в VB.net.
...
Dim a, b As Integer
Dim Particle As New IO.BinaryReader(IO.File.OpenRead(Path))
Try
Dim ontot As Double = Particle.ReadInt16
Dim omodel As Double = Particle.ReadInt16
Dim onruns As Double = Particle.ReadInt16
Dim onk As Integer = Particle.ReadInt16
For a = 1 To ontot
For b = 1 To onruns
Dim obodys As Double = Particle.ReadSingle
Dim oNx As Double = Particle.ReadSingle
Dim oNy As Double = Particle.ReadSingle
Dim oNz As Double = Particle.ReadSingle
Dim oVx As Double = Particle.ReadSingle
Dim oVy As Double = Particle.ReadSingle
Dim oVz As Double = Particle.ReadSingle
Dim onames As Integer = Particle.ReadInt16
Next
Finally
Particle.Close()
End Try
....
Данные читаются но в их корректном чтении я сомневаюсь, так как полученных данных должно быть больше чем получаю.
Мне кажется дело в формате данных???
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа: Markus
Вопросов: 1
Ответов: 5
Профиль | | #1
Добавлено: 11.03.11 15:55
Прошу прощенья пропустил что все данные я сразу заношу в массив
Номер ответа: 2
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #2
Добавлено: 11.03.11 17:15
Я думаю тут мало людей, знающих что такое фортран. Если опишешь формат бинарика, то можно будет для него код чтения придумать.
Тебе нужно поменять типы на нужные. Например, для первых 4-х считываемых переменных подойдет целочисленный тип (Short или Integer)
ReadSingle читает тип Single а не Double.
ReadInt16 - Short (он же Int16)
Номер ответа: 3
Автор ответа: Markus
Вопросов: 1
Ответов: 5
Профиль | | #3
Добавлено: 11.03.11 17:43
В этом вся и сложность так как о формате бинарника можно судить только по фортрановскому коду.
Насколько я знаю фортрановский real*4 это Single в VS , а real*8 это Double.
Short или Integer чему соответствует: ReadInt16,ReadInt32,ReadInt48?
У меня Vb.net 2005.
Номер ответа: 4
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #4
Добавлено: 11.03.11 19:05
Кстати, фортран современный или какой-нибудь доисторический
PS: 2Artyom: Это не ты случайно:
Номер ответа: 5
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 11.03.11 22:29
Номер ответа: 6
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #6
Добавлено: 11.03.11 22:39
PS: 2Artyom: Это не ты случайно:
не понял к чему это
Номер ответа: 7
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #7
Добавлено: 11.03.11 22:44
А, забей, значит не ты
Номер ответа: 8
Автор ответа: Markus
Вопросов: 1
Ответов: 5
Профиль | | #8
Добавлено: 13.03.11 22:19
Какая версия фортрана незнаю но этот код точно совместим с G95, gfortran.
В какой последоватльности считываются данные судя по фортрановскому коду?
Как я понял здесь используется неформатированной вывод с последовательным доступом.
Из книге по фортрану такой тип файлов с данными состоит из записей с переменной длиной разделенной маркерами, данные хранятся в двоичном представлении. В начале и в конце записи с переменной длиной располагается служебная инофрмация - поле счетчика, 4-байтовое целове число, значений которого равно количеству байтов данных в этой записи.
Нужно ли при чтении в VB.net учитывать эти маркеры?
Как я думаю name(1:ntot) это и есть маркер.!?
Номер ответа: 9
Автор ответа: Markus
Вопросов: 1
Ответов: 5
Профиль | | #9
Добавлено: 13.03.11 22:22
В фортране по умолчанию если не определено это отдельно тип integer четырехбайтный.
Номер ответа: 10
Автор ответа: Markus
Вопросов: 1
Ответов: 5
Профиль | | #10
Добавлено: 14.03.11 07:47
Спасибо проблема решена. Как оказалось в конце и в начале каждой записи стоят четырех-байтные маркеры. Что бы ничего не съехало при считывании эти маркеры надо учитывать.