Страница: 1 |
Вопрос: Чтение бинарника (Fortran vs VB.Net) | Добавлено: 11.03.11 14:53 |
Автор вопроса: ![]() |
Добрый день,
У меня есть бинарный файл и код для его чтения написанный на фортране. Мне нужно сделать читалку на языке 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 5 |
Профиль | Цитата | #1 | Добавлено: 11.03.11 15:55 |
Прошу прощенья пропустил что все данные я сразу заношу в массив
|
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #2 | Добавлено: 11.03.11 17:15 |
Я думаю тут мало людей, знающих что такое фортран. Если опишешь формат бинарика, то можно будет для него код чтения придумать.
Тебе нужно поменять типы на нужные. Например, для первых 4-х считываемых переменных подойдет целочисленный тип (Short или Integer) ReadSingle читает тип Single а не Double. ReadInt16 - Short (он же Int16) |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 5 |
Профиль | Цитата | #3 | Добавлено: 11.03.11 17:43 |
В этом вся и сложность так как о формате бинарника можно судить только по фортрановскому коду.
Насколько я знаю фортрановский real*4 это Single в VS , а real*8 это Double. Short или Integer чему соответствует: ReadInt16,ReadInt32,ReadInt48? У меня Vb.net 2005. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 11.03.11 19:05 |
Кстати, фортран современный или какой-нибудь доисторический ![]() PS: 2Artyom: Это не ты случайно: Graphical interface is exessive ? ![]() |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #5 | Добавлено: 11.03.11 22:29 |
|
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #6 | Добавлено: 11.03.11 22:39 |
VβÐUηìt пишет:
PS: 2Artyom: Это не ты случайно: не понял к чему это |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 11.03.11 22:44 |
А, забей, значит не ты ![]() |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 5 |
Профиль | Цитата | #8 | Добавлено: 13.03.11 22:19 |
Какая версия фортрана незнаю но этот код точно совместим с G95, gfortran.
В какой последоватльности считываются данные судя по фортрановскому коду? Как я понял здесь используется неформатированной вывод с последовательным доступом. Из книге по фортрану такой тип файлов с данными состоит из записей с переменной длиной разделенной маркерами, данные хранятся в двоичном представлении. В начале и в конце записи с переменной длиной располагается служебная инофрмация - поле счетчика, 4-байтовое целове число, значений которого равно количеству байтов данных в этой записи. Нужно ли при чтении в VB.net учитывать эти маркеры? Как я думаю name(1:ntot) это и есть маркер.!? |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 5 |
Профиль | Цитата | #9 | Добавлено: 13.03.11 22:22 |
В фортране по умолчанию если не определено это отдельно тип integer четырехбайтный. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 5 |
Профиль | Цитата | #10 | Добавлено: 14.03.11 07:47 |
Спасибо проблема решена. Как оказалось в конце и в начале каждой записи стоят четырех-байтные маркеры. Что бы ничего не съехало при считывании эти маркеры надо учитывать. |
Страница: 1 |
|