Fortran中的数据读取

时间:2014-06-02 20:31:54

标签: matlab fortran binaryfiles

编辑:我这只是关于Fortran的一个问题,并将开始一个关于转换为MATLAB的新问题。

ORIGINAL:

我正在研究一个项目,并试图将一些旧的Fortran代码移植到Matlab中。我几乎没有Fortran经验,所以我不太确定以下代码中发生了什么。 Fortran代码只是用于解释二进制文件中的数据,我在将内容移植到MATLAB中取得了一些不错的进展,但是在以下部分遇到了困难:

  IMPLICIT NONE

  DOUBLE PRECISION      SCALE

  CHARACTER*72          BLINE
  CHARACTER*72          DATA_FILE_FULL_NAME
  CHARACTER*6           DATA_FILE_NAME

  CHARACTER*4           CH4, CH4F
  REAL*4                RL4
  EQUIVALENCE          (RL4,CH4)

  CHARACTER*2           C2
  LOGICAL               LFLAG

  c2='69'
  LFLAG=.TRUE.

  DATA_FILE_FULL_NAME='./'//DATA_FILE_NAME//'.DAT'

  OPEN(UNIT=20, FILE=DATA_FILE_FULL_NAME, ACCESS='DIRECT',
 .     RECL=72, status='OLD')
    READ(20,REC=1) BLINE
    CH4f=BLINE(7:10)
    call flip(4,lflag,ch4f,ch4)
    SCALE=RL4

  RETURN
  END  

c   ..................................................
    subroutine flip(n,lflag,ch1,ch2)
c   ..................................................

  integer*4        n, i
  character*(*)    ch1, ch2
  logical          lflag

  if(lflag) then
    do i=1,n
      ch2(i:i)=ch1(n-i+1:n-i+1)
    enddo
  else
    ch2=ch1
  endif

  return
  end   

我所困扰的是获得SCALE的正确值,因为我不确定RL4发生了什么。有人可以向我解释为什么RL4会改变值以及什么过程会改变它以便我可以将这个过程放到MATLAB中?

1 个答案:

答案 0 :(得分:0)

代码可能会更改Endianness - 字节交换。 equivalence表示等价变量共享内存,您可以在文件交换后将从文件读取的4个字节视为一个数字。

因此,四个字节被解释为四字节实数RL4并在此之后转换为double precisionscale

仅当逻辑lflag为真时才进行字节交换。这可能是当文件的字节顺序与机器本机字节顺序不同时。

在Matlab中,您可以使用http://www.mathworks.com/help/matlab/ref/swapbytes.html

只需读取4字节浮点数并在必要时交换字节。