3

これはおそらく些細な質問ですが、何らかの理由でこの問題を解決するのに苦労しています。2 つの列に一連の数値が必要な入力ファイルから読み取っています。最初の列は、時間を表す整数のリストです (例: 0530)。2 番目の列は、5 桁の長さで小数点以下 3 桁の実際のデータのリストです (例: 19.213)。2 つの列の間には 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ブロック内の配列全体を一度に読み取ります。それがファイルであるため、一度に1つの要素を読み取る必要があります。このような:

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
于 2013-03-07T18:34:37.057 に答える