2016-11-27 3 views
1

私は84480行のデータファイルを持っており、それぞれ4224行のサブルーチンで20個のファイルに分割しています。今度は、これらのファイルを別のサブルーチンで1つずつ使用して分析したいと思います。しかし、私が試したとき、私はランタイムエラーを取得しています:ファイルの終わり。ここでランタイムエラー:ファイルの終わり

は、メインプログラムここ

real (kind = 8) :: x(84480),y(84480),x1(4424),y1(4424) 
open(1000,file='datafile.txt',status='old') 
n = 20   ! number of configurations 
m = 84480  ! total number of lines in all configurations 
p = 4224  ! number of lines in a single configuration 
no = 100  ! starting file number configurations 
do i=1,m 
    read(1000,*) x(i),y(i) 
end do 
call split(x,y,m,n) 
do i = 1,20 
    open(no) 
    do j = 1,p 
     read(no,*) x1(j),y1(j) ! error is occurring in here 
    end do 
    no = no + 1 
end do 
end 

の構造である。このサブルーチンは、出力ファイルに正しくfort.119fort.100を生産しているサブルーチン

subroutine split(x,y,m,n) 
integer , intent (in) :: m,n 
real (kind = 8) , intent(in) :: x(m),y(m) 
integer :: i,k,j,p 
p = 100 
do i=0,n-1 
    k = i*4224 
    do j = k+1,k+4224 
     write(p,*) x(j),y(j) 
    end do 
    p = p + 1 
end do 
end subroutine split 

です。しかし、次のエラーが表示されます。

どこが間違っていますか?

+0

各ファイルの末尾に空白行を書き込んでください。また、読み取りサイクルで "no"ファイルを閉じます。 –

+0

'@ MichaelO.'いいえ、動作していません。再度同じエラーが表示されます。 – Joe

+0

さて、各ファイルの読み書きのために明示的に名前をつけなければなりません。 –

答えて

1

ここで興味のあるのはファイル接続です。ここでのプログラムは、preconnectionopenの2つの接続形式を使用します。 datafile.txtへの接続はここでは無視されます。

は、我々はユニット番号pが以前open文ではなかった

write(p,*) x(j),y(j) 

とサブルーチンで事前接続を参照してください。これは、デフォルトのファイル名fort.100(など)が来る場所です。

サブルーチンが呼び出されたあと、20個の事前接続されたユニットにそれぞれデータが書き込まれています。これらの接続のそれぞれは、ファイルの最後に配置されます。これは注目すべき部分です。サブルーチンの後、我々はすでにファイルに接続されているユニット番号との接続を開いて、接続を閉じていないので、我々は、ある

open(no) 

でループに来て、

。これは完全に受け入れられます。しかし、我々はこれが何を意味するのか理解しなければならない。

open(no)には、ファイル指定子がありません。これは、ユニットが以前に接続されたファイルに接続されたままであることを意味します。他の指定子がないので、接続に関する何も変更されません。特に、接続は再配置されません。各ファイルの最後にはまだあります。

だから、読んでみると、私たちはファイルの終わりに位置するときにファイルから読み込もうとしています。結果:ファイルのエラーが終了しました。

これを解決するにはどうすればよいですか?

1つの方法は、接続を再配置することです。 open(no, position='rewind')にすることはできますが、それはできません。質問のコメントで提案されているように、私たちは、読書のための各接続を閉じ、(明示的position='rewind'と)ループで再度開くことができ、しかし、代わりに

rewind no ! An unfortunate unit number name; could also be rewind(no). 

があります。

+0

@ 'francescalus'非常にありがとうございます。 – Joe

関連する問題