0

ファイルからバイナリ データを読み込もうとしています。

INTEGER MAX_LAT,MAX_LON,MAX_SHELL,MAX_ORB_PNTS
INTEGER YYYY1,MON1,DD1,HH1,MIN1,DOY1
REAL*8 SEC1

OPEN(20,FILE=INPUTFILE,STATUS='OLD',FORM='UNFORMATTED')
READ(20)MAX_LAT,MAX_LON,MAX_SHELL,MAX_ORB_PNTS
...
READ(20)YYYY1,MON1,DD1,DOY1,HH1,MIN1,SEC1
...
CLOSE(20)

その間に(「...」を入れたところ)、読み取ったデータのバイトスワッピングと印刷を行っているだけです。

このコードを実行すると、最初の READ は正常に機能します。したがって、入力ファイルが正しい場所にあると確信しています。しかし、2番目のREADの行でこのエラーが発生します:

Fortran runtime error: End of file

私の変数のデータ型は、ファイルを書き込んだプログラムと同じです。とにかく、ファイルは 3000 KB を超えているため、4 つの整数値を読み取った後、ファイルの終わりに到達できないと確信しています。

編集:以下のコメントで述べたように、問題はエンディアンでした。OPEN ステートメントの単純な CONVERT='SWAP' で問題が解決しました。すべての助けをありがとう...

4

2 に答える 2

0

エラーが「記録の終わり」ではなく「ファイルの終わり」であることは奇妙です。正しいファイルを開いていますか? 最初の読み取りで読み取った値を出力して、それらが正しいことを確認しましたか? 必要に応じて、16 進エディタを使用して期待値を決定します。

16 進エディタでファイルを調べて、レコード長を確認し、読み取りで予想される長さと比較します。Fortran によって記述されているため、各レコードにはレコード長 (通常は 4 バイト) の前後の値が含まれます。いくつかのコメントで示唆されているように、テスト ファイルを作成するかドキュメントを確認することで、ファイル内のレコード長の値の長さを把握し、現在のコンパイラが使用しているものと比較できます。一部のコンパイラには、使用する長さを変更するためのコンパイル オプションがあります。通常は 4 バイトですが、8 バイトが使用されることもあります。

于 2012-05-04T15:25:40.480 に答える
0

Fortran でのバイナリ I/O は非常に扱いにくい場合があります。C のような動作にはストリームを使用することをお勧めします。素敵な紹介がここにあります。

このページは次のように要約できます。

書き込み:

OPEN(UNIT=11, FILE="file.name", STATUS="NEW", ACCESS="STREAM")
WRITE(11) your,data1,variables
WRITE(11) more,data2

読む:

OPEN(UNIT=22, FILE="file.name", STATUS="OLD", ACCESS="STREAM")
ipos = 1
READ(22,POS=ipos) your,data1,variables
ipos = IPOS + SIZEOF(your) + SIZEOF(data1) + SIZEOF(variables)
READ(22,POS=ipos) more,data2
于 2012-05-04T12:25:24.270 に答える