2017-01-09 4 views
1

私が改善しているプログラムでは、Fortranが既存のファイルを検出しないことに気付きました。これは修正されていない論理エラーにつながった。あなたが問題やエラーを指摘し、私にあなたの訂正を与えることができれば非常に感謝します。ファイルが存在しないことを検出できません。

open(unit=nhist,file=history,iostat=ierr)!This setting cannot exit program if file does not exist because ierr is always 0 
    if (ierr /=0) then 
    write(*,*)'!!! error#',ierr,'- Dump file not found' 
    stop 
    endif 

    !I used below statement, the program exits even though a file is existing 
     open(unit=nhist,file=history,err=700) 
    700 ierr=-1 
     if (ierr /=0) then 
     write(*,*)'!!! error#',ierr,'- Dump file not found' 
     stop 
     endif 

答えて

2

ここでは2つの明確な問題があります。別々に見てみましょう。

まず、コメントがierrは常にゼロに設定されていることを示唆している

open(unit=nhist,file=history,iostat=ierr) 

を検討してください。さて、なぜにするべきではないのですか? ierrは、エラーの場合はゼロではありませんが、エラーが存在しないファイルですか?

必ずしもそうではありません。 status=指定子がない場合、デフォルトのstatus='unknown'が使用されます。コンパイラは、ファイルが存在しない場合には、この場合のopeningをエラーとして扱う必要はありません。それは、書き込み時に必要に応じて作成したり、読み込もうとすると文句を言う可能性があります。

openステートメントにstatus='old'を追加することは、「ファイルが存在するはずです」と言う通常の方法です。エラーがここにあります場合は

第二に、

 open(unit=nhist,file=history,err=700) 
    700 ierr=-1 
     if (ierr /=0) then 
     ... 

を検討し、実行が700ラベル付き文に移されます。このステートメントから、ierrはゼロ以外の値に設定され、オフになると、そのエラーを処理するためにif構造に行きます。

700というラベルのステートメントも、エラーがなくても実行されます。つまり、単にopenの次のステートメントであり、それを見逃すブランチはありません。 [私はそのような分岐の例を挙げることができましたが、私は現代的なコードでerr=の使用を奨励したくありません。 。作業iostat=もので]

はるかに好ましいしかし、あなただけのファイルの存在をテストしたい場合は、お問い合わせ・バイ・ファイルを検討:

logical itexists 
inquire (file=history, exist=itexists) 
if (.not.itexists) error stop "No file :(" 

いくつかは、これが持つよりも優れている主張openステートメントのstatus='old'

+0

Francescalus様、ありがとうございました!はい。これは、 'status = old'を追加すると動作します。 – Leon

関連する問題