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