2

代码:

program a
implicit double precision (a-h,o-z)
dimension a(3,3),b(3)

open(1,file='matrix.dat')
do i=1,3
    read(1,*) b(i)(a(i,j),j=1,3)
enddo
close(1)

stop
end

错误:

At line 7 of file ea.for (unit=1, file='matrix.dat')
Fortran runtime error: End of file

矩阵 a(3*3), b(3):

3
2.d0   -7.d0    4.d0    4.d0
1.d0    9.d0   -6.d0    4.d0
-3.d0    8.d0    5.d0    2.d0
4

2 回答 2

1

不要1用作单位编号 - 尝试类似1234.! 较低的单位编号保留给“特殊单位”,如STDOUT, STDERR, STDIN。另请参阅这篇文章:ansys 的 linux 中的分段错误

要检查您是否尝试读取超出文件末尾或错误的列数,您可以iostat=ierrorread语句中输入以检查读取时是否发生错误。ierror<0对应于“文件结尾”,而ierror>0表示发生错误期间read

如果您为矩阵值提供的内容对应于文件matrix.dat,那么您没有读取第一个(整数)值3

这是为了说明,应该可以工作:

program a_test
  implicit none
  real    :: a(3,3),b(3)
  integer :: dummy, ierror, i, j

  open(unit=1234,file='matrix.dat')
  read(1234,*) dummy
  do i=1,3
      read(1234,*,iostat=ierror) b(i),(a(i,j),j=1,3)
      if (ierror>0) then
        stop 'Error while reading from file. '
      elseif (ierror<0) then
        stop 'Reached end of file. '
      endif
  enddo
  close(1234)

  write(*,*) 'a='
  write(*,*) a(1,:)
  write(*,*) a(2,:)
  write(*,*) a(3,:)
  write(*,*) 'b=',b
end
于 2013-10-17T06:19:16.730 回答
0

Fortran 中的读取命令将文件中的活动点移动到下一行,以便下一个读取命令可以读取下一行。我最好的猜测是最后一次调用“read”是在寻找一个结束符,试图移动到下一行,但是却跑到了文件的末尾。查看在输入文件末尾添加硬回车是否可以解决问题。(我知道一些老编辑会抱怨文件末尾没有空行,我认为这就是原因。)

于 2013-10-17T02:36:20.080 回答