2015-11-30 1 views
0

Я хочу прочитать массив значений двойной точности, записанных в двоичном файле Matlab, в код в Fortran (компилятор gfortran), однако мой код для чтения не работает. Не могли бы вы показать мне правильный способ сделать это?Как читать бинарный файл, написанный Matlab в Фортране?

Вот мой код Matlab, который работает.

a=[0.6557 0.0357 0.8491 0.9340 0.6787]; 

fid=fopen('ft1.bin','w'); 
fwrite(fid,a,'double'); 
fclose('all'); 

fid=fopen('ft1.bin','r'); 
a2=fread(fid,5,'double'); 
fclose('all'); 

a2 

Вот мой Fortran, код, который возвращает ошибку при попытке прочитать файл ft1.bin

program code1 
implicit none 

double precision, dimension(5) :: a2 
integer :: i 

open(1,FILE="ft1.bin",FORM='UNFORMATTED',ACTION='READ') 
read(1) a2 
close(1) 

print *, a2 

end program code1 

Когда я пытаюсь запустить его,

gfortran code1.f90 -o bb1 
./bb1 
At line 8 of file code1.f90 (unit = 1, file = 'ft1.bin') 
Fortran runtime error: Unformatted file structure has been corrupted 

ответ

3

Надо, чтобы избежать record based I/O с ACCESS="STREAM", например,

PROGRAM test 
    IMPLICIT NONE 

    INTEGER, PARAMETER :: dp = KIND(1D0) 
    INTEGER :: funit, io_stat 
    REAL(dp) :: a(5) 

    OPEN(NEWUNIT = funit, FILE = 'ft1.bin', STATUS = "OLD", ACCESS = "STREAM", FORM = "UNFORMATTED", IOSTAT = io_stat) 
    READ(funit, IOSTAT = io_stat) a 
    WRITE(*, *) a 
    CLOSE(funit) 
END PROGRAM 
+0

спасибо, добавив 'ACCESS = 'STREAM'', заставив его работать – Guddu

+1

Нет смысла использовать' IOSTAT', если вы не проверите его возвращаемое значение для ошибок. –

Смежные вопросы