试图将2列输入文件读入两个独立的阵列并且遇到很多麻烦

时间:2013-03-07 18:18:10

标签: arrays fortran

这可能是一个微不足道的问题,但由于某种原因,我在解决这个问题上遇到了很多麻烦。我正在读取一个输入文件,该文件必须包含两列数字。第一列是表示时间的整数列表(例如0530)。第二列是5位数字的实数数据列表,小数点后3位数(例如19.213)。两列之间有3个空格。我想把这个读入我的程序到单独的数组中。我已经在最大可能长度(1440)处统计了数组的尺寸,如下所示。我想最终在函数中使用这个数组,但我甚至无法使输入正常工作。谢谢你的帮助。

PROGRAM readtest1
IMPLICIT NONE

INTEGER, DIMENSION(1440) :: t
REAL, DIMENSION(1440) :: tuvr

OPEN(1, FILE='AP2412.tv', STATUS='old', ACTION='read')
OPEN(2, FILE='timetuvr.txt', STATUS='replace', ACTION='write')
READ(1,100) t, tuvr
100 FORMAT(I5, F8.3)

WRITE(2,100) t, tuvr

END PROGRAM readtest1

哦,当我编译并运行程序时,我收到错误'FORTRAN运行时错误:格式化传输中项目2的预期REAL,得到了INTEGER) 我相信fortran正在直接读到列,这导致了这个问题,但我不确定如何修复它。我需要一个双循环吗?

1 个答案:

答案 0 :(得分:3)

read (...) t, tuvr一次读取整个数组。您希望一次读取一个元素,因为它们就是文件。像这样:

do i=1, 1440
   read (1, '(i5,f8.3)' ) t(i), tuvr(i)
end do

根据文件中的数字是否完全在列中,您可能会发现必须使用列表导向的IO:read (1, *) t(i), tuvr(i)。这种方法非常灵活且易于使用。

如果文件可能少于1440行,请尝试这样的操作,检测文件的结尾并计算读取的行数:

program test

use, intrinsic :: iso_fortran_env

implicit none

integer, parameter :: ArrayLen = 1440
INTEGER, DIMENSION(ArrayLen) :: t
REAL, DIMENSION(ArrayLen) :: tuvr
integer :: i, ReadCode, num


num = 0
ReadLoop: do i=1, ArrayLen

   read (1, '(i5,f8.3)', iostat=ReadCode ) t(i), tuvr(i)

   if ( ReadCode /= 0 ) then
      if ( ReadCode == iostat_end ) then
         exit ReadLoop
      else
         write ( *, '( / "Error on read: ", I0 )' )  ReadCode
         stop
      end if
   end if

   num = num + 1

end do ReadLoop

end program test