2016-07-27 8 views
1

Fortranでファイルを読むときに少し問題があります。あなたが見ることができるように、私は特定の長さの特定のレコードを読むファイルを覆い尽くしています。直接アクセスファイルを読み取っているときにGFortran I/Oエラー5002が発生しました

特定のレコードになると、IOSTATエラー5002が発生します。これで私の質問は、このエラーの意味です:ファイルの終わりか、レコードが残っていないのでしょうか?私はそれを無視することはできますか?

私はMinGW GFortran 4.8.0を使用しています。

は、ここでは、コードです:iostat=指定子によって返さ

PROGRAM test_read 

INTEGER*4   HCM_error 
DOUBLE PRECISION N_Record(22) 
CHARACTER*8   C_Record(22) 

EQUIVALENCE   (N_Record,C_Record) 

OPEN (UNIT=11, FILE='C:/BORDER/D__HOL.000',STATUS='OLD', ACCESS='DIRECT',RECL=176, ACTION='READ', IOSTAT=IOS) 

HCM_error=0 

DO N_rec = 1, 2000 
    READ (11, REC=N_rec, IOSTAT=IOS) C_Record 

    WRITE(*,*) "|",IOS,' ',N_rec,' ',N_record(21),' ',N_record(22),"|" 

    !End of file reached (or non existing record) ? 
    IF ((IOS .LT. 0) .OR. (IOS .EQ. 36)) EXIT 

    IF (IOS .NE. 0) THEN 
     !Error in (border-) line data 
     HCM_Error = 1049 
     EXIT 
    END IF 
END DO 

CLOSE(UNIT=11) 

WRITE (*,*) HCM_error 
END PROGRAM 
+0

'ios'の値が5002であることを意味しますか? – francescalus

+0

はい、iosの値は5002です。 – Ramirez

+0

IOMSG =を使用して試したところ、存在しないレコード番号が表示されます。 – Ramirez

答えて

2

非ゼロ値は、ポータブル間でのコンパイラではありません。 (存在する場合)

  • この中には文字変数

iomsg=指定子を使用し

  • コンパイラのドキュメントを読む:あなたが特定のコードが何を意味するのかを決定したい場合は、次の2つのオプションが持っていますあなたがiomsg=を試してみたら、「存在しないレコード番号」というメッセージが出てきました。だから、問題は解決しました。

    まあ、ほとんど。もっと言いたいことがあります。

    直接アクセスでレコードを順番に処理していますが、最初に「ファイルの終了」状態になることなく「レコードなし」状態に達していることに驚くかもしれません。あなたは、 "ファイルの終わりに達しました"というコメントを付けて(IOS .LT. 0)をテストしています。

    ダイレクトアクセスのために接続されたファイルを読むとき、ファイルの終了条件は発生しません。

    ファイルの末尾を超えてレコードが有効な番号ではないことを検出するにはどうすればよいですか?あまり意味はありませんが、iostat=からの正の数値はエラー状態を示します。あなたは今、この特定のもの5002の意味を知っています。


    私はおそらくまたiomsg=の文字変数は成功がない場合にのみ転送文によって定義されていることを追加する必要があります。転送が失敗したことが分かっている場合にのみ考慮してください。

  • 関連する問題