读取更多数据文件FORTRAN90

时间:2014-11-29 12:28:38

标签: fortran data-files

我有一个关于f90的问题正如标题所说。 我有很多.dat个文件(比如15个文件,每个文件有2列和2000行),我需要使用它们。 我需要将所有数据保存在一个独特的矩阵中(将有30列和2000行)。 但是当我在执行期间使用指令READ(21,*) MATRIX时,它说

   Fortran runtime error: End of file

我认为这是因为矩阵的维度与单个数据文件的维度不同。 有没有办法让它发挥作用? 是否有可能在DO循环中打开所有数据文件,而不是多次重复OPEN语句?

这是代码

program expected

REAL*8, ALLOCATABLE, DIMENSION ( :, :) :: dati


OPEN (unit=20, status='OLD', file='PRINT_07.CSV', form='FORMATTED')
OPEN (unit=21, status='OLD', file='PRINT_08.CSV', form='FORMATTED')
OPEN (unit=22, status='OLD', file='PRINT_09.CSV', form='FORMATTED')
OPEN (unit=23, status='OLD', file='PRINT_10.CSV', form='FORMATTED')
OPEN (unit=24, status='OLD', file='PRINT_11.CSV', form='FORMATTED')
OPEN (unit=25, status='OLD', file='PRINT_12.CSV', form='FORMATTED')
OPEN (unit=26, status='OLD', file='PRINT_13.CSV', form='FORMATTED')
OPEN (unit=27, status='OLD', file='PRINT_14.CSV', form='FORMATTED')
OPEN (unit=28, status='OLD', file='PRINT_15.CSV', form='FORMATTED')
OPEN (unit=29, status='OLD', file='PRINT_16.CSV', form='FORMATTED')
OPEN (unit=30, status='OLD', file='PRINT_17.CSV', form='FORMATTED')
OPEN (unit=31, status='OLD', file='PRINT_18.CSV', form='FORMATTED')
OPEN (unit=32, status='OLD', file='PRINT_19.CSV', form='FORMATTED')
OPEN (unit=33, status='OLD', file='PRINT_20.CSV', form='FORMATTED')
OPEN (unit=34, status='OLD', file='PRINT_21.CSV', form='FORMATTED')


ALLOCATE ( dati(30,2000) )

READ(20,*) dati


end program    

在一个更简单的程序中,我已经以这种方式解决了数据导入问题。但我仍然有一次打开多个数据文件的问题。

program mats

REAL, ALLOCATABLE, DIMENSION (:,:) :: mat


OPEN (UNIT=21, STATUS='OLD', file='mat1.dat', form='FORMATTED')
OPEN (UNIT=22, STATUS='OLD', file='mat2.dat', form='FORMATTED')

OPEN (UNIT=23, STATUS='UNKNOWN', file='mat.dat', form='FORMATTED')


DO i=1,2
OPEN (UNIT=20+i, STATUS='OLD', file= 'mat'i'.dat', form='FORMATTED')
END DO


ALLOCATE ( mat(5,2) )

mat=0

PRINT*, mat

  READ(21,*) mat(1:3,1:2)
  READ(22,*) mat(4:5,1:2)

PRINT*, mat

end program

1 个答案:

答案 0 :(得分:0)

这是一个草图,为您提供如何以更优雅的方式处理多个文件的概念。它不是您问题的解决方案,也不是经过测试的 - 它显示了一些概念。

character (len=80) :: filename
   do i=7, 20
      write (filename, '( "PRINT_", I2.2, ".CSV" )' )  i
      open ( unit=55,file=filename, status="old", action="read", form="formattted" )
      read (55, datai (i,:) )
      close (unit=55)
    end do