Открытие двоичных файлов в Фортране: статус, форма, доступ - PullRequest
7 голосов
/ 03 апреля 2012

Я работал с Fortran в течение многих лет, но файловый ввод-вывод все еще неясен для меня. Мое понимание status, form, access, recl ограничено, потому что я только нуждался в определенных случаях использования в аспирантуре.
Я знаю, что двоичные файлы Фортрана имеют дополнительную информацию в верхней части файла, которая описывает размер файла. Но это никогда не было проблемой для меня раньше, потому что мне приходилось иметь дело только с файлами Fortran в коде Fortran, где дополнительная информация необходима, но невидима.

Но как мне открыть плоский двоичный файл в Фортране?

В прошлом я мог открыть бинарный файл Фортрана, используя Фортран, выполнив что-то вроде этого:

open(id,file=file_name,status='old',
     +     form='unformatted',access='direct',recl=4,iostat=ok)
      if (ok .ne. 0) then
        write(1,20) id,ok,file_name
                else
        write(1,21) id,file_name

Но как это изменится для плоского двоичного файла, в котором нет информации заголовка Fortran? Что еще более важно, где есть хорошая ссылка для более подробного описания этих терминов: status, form, access, recl?

Ответы [ 4 ]

10 голосов
/ 04 апреля 2012

Я ненавижу это делать, но чувствую, что если бы я надеялся найти ответы в этом посте, путь вперед не был бы ясен. Итак, вот путь вперед.

Короткая версия

В Fortran 77/90, чтобы открыть стандартный двоичный файл Fortran, вы можете написать:

OPEN (5, FILE="myFile.txt")

Но чтобы открыть плоский двоичный файл не-Фортрана, вам нужно написать что-то вроде этого:

OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1)

Это различие заключается в том, что двоичные файлы в стиле Фортрана имеют 4-байтовый заголовок и нижний колонтитул вокруг каждой «записи» в файле. Эти колонтитулы описывают размер данных, содержащихся в записи. (В наиболее распространенном случае каждый двоичный файл, который вы встречаете, будет иметь только одну запись.)

Длинная версия

Фортран предполагает множество стандартных аргументов open. Фактически, наш оригинальный пример может быть записан в следующей подробной форме, чтобы показать все значения по умолчанию, которые были приняты.

OPEN (5, FILE="myFile.txt") 
OPEN (5, FILE="myFile.txt", FORM="FORMATTED", 
     +   ACCESS="SEQUENTIAL", STATUS="UNKNOWN")

Давайте посмотрим на каждый аргумент:

  • FORM определяет, состоит ли файл из текста (form='formatted') или двоичных данных (form='unformatted').

  • ACCESS определяет, считываете ли вы данные из файла в порядке (access='sequential') или в любом порядке (access='direct').

  • RECL определяет количество байтов, которые входят в каждую запись. Например, recl=1 просто говорит, что длина записи составляет 1 байт каждая; возможно, они являются 1-байтовыми целыми числами.

  • STATUS определяет, существует ли файл уже. Аргумент STATUS="UNKNOWN" означает, что файл может еще не существовать, но если этого не произойдет, он будет создан. Если вы хотите защитить от возможности записи поверх старого файла, используйте: STATUS="OLD". Точно так же, если вы знаете, что файл еще не существует, вы можете использовать: STATUS="NEW".

Для получения дополнительной информации:

Эти открытые операторы также влияют на последующие операторы чтения / записи / закрытия. В моем исходном сообщении мне нужно было знать, что если вы открываете файл прямого доступа, вы должны записать его в файл прямого доступа. (То есть заголовки / нижние колонтитулы Fortran не будут включены в ваш двоичный файл.) Однако по умолчанию функциональность Fortran заключается в создании файлов с последовательным доступом с включенными верхними и нижними колонтитулами Fortran.

Для получения дополнительной информации о open утверждениях в Fortran 77/90, есть хорошие ресурсы онлайн:

Приятная страница от Линь Джинсена из Университета Бишопа (большое спасибо).

Чуть больше официальной документации от IBM для ее компиляторов.

5 голосов
/ 03 апреля 2012

Одно предупреждение - это длина записи, указанная в recl, по умолчанию - число 4-байтовых слов с неотформатированными записями (по крайней мере, в компиляторах Intel используйте byterecl, чтобы указать иное), поэтому вам, возможно, придется указать компилятор вариант или использовать recl=1.

Поскольку ваш код стоит, используя неформатированный и прямой, все, что вам нужно сделать, чтобы убедиться, что вы читаете данные правильно, это выбрать соответствующую длину записи. Но некоторые компиляторы FORTRAN не всегда хорошо работают с неформатированными двоичными файлами, и я бы предложил принять HDF5 в будущем.

Если доступно, ваш компилятор может разрешить recordtype='stream':

open (id, file=file_name, status='old', form='unformatted' &
        , access='stream', iostat=ios)
! read (id, pos=1) someValue
2 голосов
/ 03 апреля 2012

Вы можете указать open использовать новый режим потокового ввода-вывода в Fortran 2003 с access='stream'.

1 голос
/ 03 апреля 2012

Если вы не можете использовать потоковый доступ, вы должны использовать прямой доступ.Смотрите ссылки в ответ на этот вопрос .

...