7

Fortranで読みたいバイナリファイルがあります。問題は、Fortranによって作成されていないため、レコード長インジケーターがないことです。したがって、通常のフォーマットされていないFortran読み取りは機能しません。

私はこっそりとファイルをフォーマットされたファイルとしてバイト単位(または実際には4バイト×4バイト)で文字配列に読み取り、文字の内容を整数に変換して、伝達関数または恐ろしい同等性ステートメント。しかし、これは機能しません。一度に4バイトを読み取ろうとすると、inquireステートメントからのPOS出力によると、読み取りは6000バイト程度にスキップされ、文字配列にジャンクがロードされます。

だから、それはダメです。私が忘れているこのアプローチの詳細はありますか?それとも、Fortranでこれを行うための根本的に異なったより良い方法がありますか?(ところで、私はinteger*1配列とバイト配列にも読み込もうとしました。これらのコードはコンパイルされますが、readステートメントに関しては、コードがクラッシュしました。)

4

1 に答える 1

11

はい。

Fortran 2003 では、言語にストリーム アクセスが導入されました。これに先立ち、ほとんどのプロセッサは、おそらく「バイナリ」などと呼ばれる、拡張機能として同等のものをサポートしていました。

フォーマットされていないストリーム アクセスは、ファイルにレコード構造を課しません。例として、特定の Fortran プロセッサのコンパニオン C プロセッサ (存在する場合) の単一の int に対応するファイルからデータを読み取るには、次のようにします。

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
INTEGER, PARAMETER :: unit = 10
CHARACTER(*), PARAMETER :: filename = 'name of your file'
INTEGER(C_INT) :: data
!***
OPEN(unit, filename, ACCESS='STREAM', FORM='UNFORMATTED')
READ (unit) data
CLOSE(unit)
PRINT "('data was ',I0)", data

エンディアンとデータ型のサイズにまだ問題があるかもしれませんが、それらの側面は言語に依存しません。

Fortran 2003 より前の言語標準に基づいて記述している場合、適切な整数変数へのフォーマットされていない直接アクセス読み取りが機能する可能性があります。これは Fortran プロセッサ固有ですが、現在の多くのプロセッサで機能します。

于 2012-07-19T22:30:51.967 に答える