3

这可能是一个微不足道的问题,但由于某种原因,我在解决这个问题时遇到了很多麻烦。我正在从一个输入文件中读取,该文件必须在两列中包含一组数字。第一列是表示时间的整数列表(例如 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 正在直接读取列,这导致了这个问题,但我”我不确定如何解决它。我需要双循环吗?

4

1 回答 1

3

read (...) t, tuvr在一个块中一次读取整个数组。您想一次读取一个元素,因为这就是它们的归档方式。像这样:

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

根据文件中的数字是否完全在列中,您可能会发现有必要使用 list-directed 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
于 2013-03-07T18:34:37.057 回答