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=ierror入れることができる列の数が間違っているかどうかを確認するには、「ファイルの終わり」に対応し、エラーが発生したことを意味します中。readierror<0ierror>0read

行列値に指定したものがファイル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 の読み取りコマンドは、次の読み取りコマンドが次の行を読み取れるように、ファイル内のアクティブ ポイントを次の行に移動します。私の最善の推測は、「読み取り」への最後の呼び出しが行末文字を探し、次の行に移動しようとしているが、代わりにファイルの最後に実行されているということです。入力ファイルの最後にハード リターンを追加することで問題が解決するかどうかを確認します。(古い編集者の中には、ファイルの最後に空白行がないと文句を言う人もいますが、これが理由だと思います。)

于 2013-10-17T02:36:20.080 に答える