Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] Файл Fortran binary -> в ASCII? Чем конвертировать файл Fortran binary в 
:(
    Опции темы
Mormishka
Дата 25.8.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



Существуют какие-либо макросы?
PM MAIL   Вверх
Фантом
Дата 25.8.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 5
Всего: 49



А что такое "файл Fortran binary"?
PM   Вверх
FCM
Дата 26.8.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Может файл данных записанный из Фортран-программы c FORM = UNFORMATED или BINARY переписать в текстовый?
PM MAIL   Вверх
Mormishka
Дата 27.8.2010, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



Цитата(FCM @ 26.8.2010,  20:59)
Может файл данных записанный из Фортран-программы c FORM = UNFORMATED или BINARY переписать в текстовый?

Да. Какая программа для этого нужна?
PM MAIL   Вверх
Фантом
Дата 27.8.2010, 17:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 5
Всего: 49



Цитата(Mormishka @  27.8.2010,  02:53 Найти цитируемый пост)

Да. Какая программа для этого нужна? 

Формат известен? Если да - проще всего написать еще одну программу на Фортране (это 7-8 строк, не больше), которая этот файл считает и в нужном текстовом виде запишет.
PM   Вверх
ertttttt
Дата 31.8.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 31.8.2010

Репутация: нет
Всего: нет



Фантом

Программу написали. При чтении методом open не читает неформатированный файл. Не понятно как сконвертировать файл Fortran binary в ASCII текст. Как это можно сделать? 


Код

program Convert
    character a(100)

    integer i


    OPEN(UNIT = 12, FILE = 'C:\Program Files\Microsoft Visual Studio\MyProjects\Convert_ivanov\x.s', FORM='UNFORMATTED',CONVERT='BIG_ENDIAN',ACTION='READ',IOSTAT=i)

    OPEN(UNIT = 17, FILE = 'C:\Program Files\Microsoft Visual Studio\MyProjects\Convert_ivanov\x_ERROR.s', FORM='FORMATTED',ACTION='WRITE')
    
    do i=1,50
    
        read(12,*) a(i)

        print *, a

    enddo

end program Convert



Это сообщение отредактировал(а) kemiisto - 31.8.2010, 11:34
PM MAIL   Вверх
kemiisto
Дата 31.8.2010, 11:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



ertttttt,  а можно примерчик файла. Расширение у него до боли знакомое... 

А с чего вообще взяли, что это 
Цитата(FCM @  26.8.2010,  21:59 Найти цитируемый пост)
файл данных записанный из Фортран-программы c FORM = UNFORMATED или BINARY

?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Фантом
Дата 31.8.2010, 13:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 5
Всего: 49



Цитата(ertttttt @  31.8.2010,  11:29 Найти цитируемый пост)

Программу написали. При чтении методом open не читает неформатированный файл.

Так ведь какой-то формат для чтения нужен, обойтись чтением под управлением списка в данном случае нельзя.
Вам нужно знать формат, в котором эти данные записаны, в противном случае их можно интерпретировать как угодно (и в самом файле эта информация не содержится).
PM   Вверх
Mormishka
Дата 31.8.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



Цитата(kemiisto @ 31.8.2010,  11:34)
ertttttt,  а можно примерчик файла. Расширение у него до боли знакомое... 

А с чего вообще взяли, что это 
Цитата(FCM @  26.8.2010,  21:59 Найти цитируемый пост)
файл данных записанный из Фортран-программы c FORM = UNFORMATED или BINARY

?

Файл прикрепил. Это файл линий тока в программе Schlumberger Eclipse. В мануале про него написано, что его можно перевести в ASCII text в Compact Visual Fortran методом open:

Programmers using Compaq Visual Fortran, who wish to read 98A and later PC binary
files will need to use CONVERT=’BIG_ENDIAN’ when they open an unformatted file,
for example.:
OPEN(UNIT=IUNIT,FILE=ZFILE,FORM=’UNFORMATTED’,CONVERT=’BIG_ENDIAN’)
...
Output files may be formatted (ASCII text) or unformatted (Fortran binary).


Это сообщение отредактировал(а) Mormishka - 31.8.2010, 15:39

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ECL_SAMPLE01.SLN0006 379,67 Kb
PM MAIL   Вверх
kemiisto
Дата 31.8.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



Когда читаем из/пишем в unformatted файл, то, естественно, ни о каких форматах чтения/записи речи идти не может. А у Вас READ(12, *). А * эта, между прочим, специфицирует формат ввода/вывода. Фантом писал об этом.

Код

PROGRAM main

  IMPLICIT NONE
  
  INTEGER :: i
  
  OPEN (unit=777, file="ECL_SAMPLE01.SLN0006", form="unformatted",              &
&   convert="big_endian", action="read")

  READ (777) i
  PRINT *, i

END PROGRAM main


Ну и (опять таки Фантом писал об этом), нужно знать что и в какой последовательности писалось в файл, чтобы считать.

Это сообщение отредактировал(а) kemiisto - 31.8.2010, 16:20


--------------------
PM MAIL WWW GTalk Jabber   Вверх
FCM
Дата 1.9.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Цитата(Mormishka @  31.8.2010,  15:35 Найти цитируемый пост)
Файл прикрепил. Это файл линий тока в программе Schlumberger Eclipse. В мануале про него написано, что его можно перевести в ASCII text в Compact Visual Fortran методом open:


Наверное в мануале написано, в каком виде они там записывались - в виде массива конкретной формы (и типа) или в цикле отдельными записями, состоящими из строк массива и/или отдельных чисел определенных типов?

Скорее всего второе, но, как уже отмечалось, нужно знать чего (т.е. какого типа и параметра разновидности ) и сколько чисел в записи - ведь один и тот же набор двоичой информации по-разному интерпретируется для разных типов.


PM MAIL   Вверх
Mormishka
Дата 1.9.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



FCM

Наверное вы это имеете ввиду?

Output files are written in a general format which consists of data arrays, each headed
by a data descriptor record. The header record consists of:
• An 8-character keyword which identifies the data in the block. Valid keywords are
described in the following chapters. Where appropriate, the keyword may be a
property, region or solution name. Use of names containing embedded blanks is
not recommended.
• A 4-byte integer defining the number of elements in the block.
• A 4-character keyword defining the type of data in the block.
Possible types are:
INTE standard (4 byte) integers
REAL single precision (4 byte) floating point reals
LOGI standard (4 byte) logicals
DOUB double precision (8 byte) floating point reals
CHAR characters (handled as 8-character words)
C0nn CHARACTER*nn strings (e.g. C065 for 65-character strings)
If the file is unformatted, the three header items are read as a single physical record. If
the file is formatted, the following Fortran format is used:
(1X, 1X, A8, 1X, 1X, I11, 1X, 1X, A4)
In ECLIPSE formatted output files, the character strings are surrounded by single
quotes for readability.
The data contents follow the descriptor (starting on a new record). Numerical arrays
are divided into blocks of up to 1000 items each. Character data are divided blocks of
up to 105 8-character words each. For unformatted files, the physical record size is the
same as the block size. Formatted files consist of 80-character physical records, read
using the following Fortran formats:
Integer 6(1X, I11)
Real 4(1X, E16.8)
Logical 25(1X, L2)
Double Precision 3(1X, D22.14)
Character 7(1X, 1X, A8, 1X)
Character*nn (1X, 1X, Ann, 1X), repeated if possible
within 80 characters
In ECLIPSE formatted output files, the 8-character words are surrounded by single
quotes for readability.
Note that multidimensional arrays are ordered according to the Fortran convention,
with the left-hand index increasing fastest. For example, in a full array of cell values for
a grid with dimensions NX*NY*NZ, the position of cell (IX,IY,IZ) would be given
by:
ICELL = (IZ-1)*NX*NY + (IY-1)*NX + IX

PM MAIL   Вверх
FCM
Дата 1.9.2010, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Навскидку, сделаем черновой прогон

Код

character(8) :: chname
integer(4)    :: num
character(4) :: chtype 

open(11,...)

do
    read(11)  chname, num, chtype
    write(*,*) chname, num, chtype
endo



В результате получим вывод (проверьте!)

INTEHEAD         10    INTE
...
GEOMETRY   26460   DOUB
....
GEOMINDX       238  INTE
...
ID_BEG            237  INTE
...
ID_END            237  INTE
...
ID_CELL         8583  INTE
...
TIME_BEG       8820  DOUB
...
SWAT              8583  DOUB
...

Т.е. в чистовом прогоне нужно последовательно  считывать  chname,num,chtype (как единую запись) и следующие за ними массивы из  num -чисел  chtype-типа (скорее всего как единую запись).


PM MAIL   Вверх
Mormishka
Дата 2.9.2010, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



Попробую. Вот образец другого файла в мануале в ASCII text

INTEHEAD 10 INTE
2 1 3 1 20 10 1997 23 50 41
GEOMETRY 42 DOUB
25. 24. 2000. 20. 23. 2000. 13. 20. 2000. 10. 17. 2000. 8. 14. 2000. 6. 10. 2000.
5. 5. 2000. 25. 24. 2000. 22. 20. 2000. 20. 15. 2000. 15. 10. 2000. 14. 9. 2000.
10. 7. 2000. 5. 5. 2000.
GEOMINDX 3 INTE
1 22 43
ID_BEG 2 INTE
2 2
ID_END 2 INTE
1 1
ID_CELL 12 INTE
9 8 5 4 4 1 9 6 5 2 2 1
TIME_BEG 14 DOUB
4.2333 7.33 18.84 24.7 29.13 34.25 41. 4. 7. 17.84 20.7 23.3300 31.05 40.
SWAT 12 DOUB
0.75 0.575 0.5 0.4 0.225 0.05 0.5 0.575 0.4 0.3 0.225 0.35
GEOMETRY 15 DOUB
30. 5. 2000. 20. 4. 2000. 26. 3. 2000. 10. 2. 2000. 5. 5. 2000.
GEOMINDX 2 INTE
1 16
ID_BEG 1 INTE
3
ID_END 1 INTE
1
ID_CELL 4 INTE
3 2 2 1
TIME_BEG 5 DOUB
4.2333 7.3300 18.8400 24.7000 29.1300
SWAT 4 DOUB
0.7500 0.5750 0.5000 0.4000
PM MAIL   Вверх
ertttttt
Дата 2.9.2010, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 31.8.2010

Репутация: нет
Всего: нет



Первые три числа прочитал. Дальше не хочет читать. Здесь другой файл этого же типа. Я поменял название на «x.s». Для меня пока важно вывести на экран, что идет после ключевого слова GEOMETRY. В данном файле после GEOMETRY идет число 162, т.е. всего 162 числа должно быть.

    program Convert

    implicit none

    integer i

    real(8) ::r1
    real(8) ::r2
    real(8) ::r3

    
    character(8) :: chname
    integer(4) :: num
    character(4) :: chtype

    open(unit=777, file='x.s', form='unformatted',convert='big_endian', action='read')

    do

        read (777) chname, num, chtype

        write(*,*) chname, num, chtype

        if (chname=='GEOMETRY') then
            do i=1,num
                read (777) r1,r2,r3
                write(*,*) r1,' ',r2,' ' ,r3,' ',i, ' ' ,num
            enddo
        end if

    enddo

    end program Convert

На экране:

INTEHEAD          10 INTE
    ☻   ☺           3    ♥
 GEOMETRY         162 DOUB
   450.000000000000          450.000000000000          2025.00000000000
           1           162
forrtl: severe (67): input statement requires too much data, unit 777, file C:\P
rogram Files\Microsoft Visual Studio\MyProjects\Proect\Debug\x.s

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.1336 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.