Преобразование данных, хранящихся в двоичных файлах Fortran 90, в удобочитаемый формат - PullRequest
1 голос
/ 02 августа 2011

По вашему опыту, в Fortran 90, как лучше всего хранить большие массивы в выходных файлах? Ранее я пытался записывать большие массивы в текстовые файлы ASCII. Например, я хотел бы сделать что-то вроде этого (благодаря рекомендации внизу страницы В Fortran 90, каков хороший способ записи массива в текстовый файл по строкам? ):

PROGRAM testing1
  IMPLICIT NONE
  INTEGER :: i, j, k
  INTEGER, DIMENSION(4,10) :: a

  k=1
  DO i=1,4
    DO j=1,10
      a(i,j)=k
      k=k+1
    END DO
  END DO

  OPEN(UNIT=12, FILE="output.txt", ACTION="WRITE", STATUS="REPLACE")
  DO i=1,4
    DO j=1,10
      WRITE(12, "(i2,x)", ADVANCE="NO") a(i,j)
    END DO
    WRITE(12, *)
  END DO
  CLOSE(UNIT=12)
END PROGRAM testing1

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

PROGRAM testing2
  IMPLICIT NONE
  INTEGER :: i, j, k
  INTEGER, DIMENSION(4,10) :: a

  k=1
  DO i=1,4
    DO j=1,10
      a(i,j)=k
      k=k+1
    END DO
  END DO

  OPEN(UNIT=13, FILE="output.dat", ACTION="WRITE", STATUS="REPLACE", &
      FORM="UNFORMATTED")
  WRITE(13) a
  CLOSE(UNIT=13)
END PROGRAM testing2

Кажется, это работает, и действительно намного быстрее и приводит к меньшим размерам файлов, как обещано в ответе здесь . Однако что мне делать, если я хотел бы иметь возможность позже работать с данными, хранящимися в двоичном коде Фортрана (например, output.dat выше), и анализировать их содержимое? Например, что если я хочу открыть массив, хранящийся в двоичном файле, в такой программе, как Microsoft Excel?

Когда я упоминал matlab в моем предыдущем посте , в ответе предлагалось открыть двоичный файл в виде шестнадцатеричного файла, выяснить и извлечь из него записи. Но я нервничаю из-за того, что попадаю в глубокую воду, так как у меня нет предыдущего опыта шестнадцатеричного слежения. Когда я спросил на доске Matlab (здесь: http://www.mathworks.com/matlabcentral/answers/12639-advice-on-reading-an-unformatted-fortran-binary-file-into-matlab) о чтении файлов Фортрана в Matlab, один человек там предположил, что использование потока Фортрана может быть простым. Но это поток Фортрана (то есть использование директивы ACCESS="STREAM" в OPEN команда), вероятно, будет похож по времени и размеру файла на текстовый файл ASCII, который я создал в моем первом примере выше?

Или вы знаете, существует ли какое-либо другое программное обеспечение, которое может автоматически считывать двоичные файлы Фортрана в какую-то удобочитаемую форму? (Или вы знаете какие-нибудь хорошие учебники по шестнадцатеричному обучению или потоку Фортрана?)

Большое спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 02 августа 2011

Поток - это выбор, независимый от выбора форматированного / неформатированного: один - «доступ», другой - «формат». По умолчанию для ввода-вывода Fortran используется доступ, ориентированный на запись.Типичный подход компилятора Фортрана для записей (по крайней мере, не отформатированных) для записи 4-байтовой длины записи до и после каждой записи.(«После» - для облегчения чтения в обратном направлении.) Используя шестнадцатеричное редактирование, вы можете проверить эти дополнительные элементы данных, которые я описал, и пропустить их в MatLab.Но они не являются частью языкового стандарта и не являются переносимыми и, конечно, не очевидны в других языках.Если вы выберете stream и не отформатированный, вы просто получите необработанную последовательность байтов, соответствующую вашим элементам данных - без лишних элементов данных, о которых нужно беспокоиться на другом языке!По моему опыту, этот вывод довольно легко читать на других языках (не пробовал в MatLab).Если это небольшой и простой проект с переносимостью файлов на другие компьютеры, не проблема, я бы, вероятно, использовал этот подход (потоковый и неформатированный), а не спецификацию формата файла, такого как HDF5 или FITS.Я бы написал массив как write (13) a, как в вашем последнем примере.В зависимости от другого языка вам, возможно, придется транспонировать размеры.Если это крупный и долгоживущий проект с переносимостью, то стоит подумать о переносном и стандартном файловом интерфейсе.

Я не знаю, можно ли прочитать какой-либо из этих форматов из Excel.Дополнительные исследования .... Возможно, вам придется написать программу для чтения двоичного файла любого формата и вывода файла в формате, понятном для Excel.

2 голосов
/ 05 января 2012
 %In MATLAB

 fid=fopen('YOUR_FILE.direct','r');  %Fortran Direct ACCESS
 frewind(fid);

 tbb=ones(367,45203);

     for i =1:367
          temp=fread(fid,[45203],'single');
          tbb(i,:)=temp; 
     end

fclose(fid)
2 голосов
/ 02 августа 2011

(преобразование комментария в ответ для потомков)

Вы специально пытаетесь получить информацию в Matlab?Если да, я настоятельно рекомендую HDF5 .Это портативный двоичный формат, который вы искали.

Для преобразования двоичного файла Фортрана в HDF5 вам потребуется прочитать исходный двоичный файл Фортрана, а затем записать те же данные в файл HDF5.Если у вас есть источник на Фортране, это должно быть довольно просто.Выделите свои массивы, убедитесь, что вы читаете массивы в том же порядке, в каком вы их написали, а затем записываете свой новый блестящий файл HDF5.

В группе HDF5 есть учебные пособия с примерами на C иFortran.Вероятно, есть пример, очень близкий к тому, что вы пытаетесь сделать.При сборке HDF5 обязательно включите поддержку Fortran.По умолчанию отключено.

...