9

私は何年も Fortran を使用してきましたが、ファイル I/O はまだ漠然としています。status、、、formについての私accessの理解reclは限られています。大学院では特定のユースケースしか必要としなかったからです。
Fortran バイナリ ファイルには、ファイルのサイズを説明する追加情報がファイルの先頭にあることを知っています。しかし、Fortran コードで Fortran ファイルを処理する必要があっただけで、余分な情報が必要でありながら目に見えないため、これまで問題になったことはありませんでした。

しかし、Fortran でフラットなバイナリ ファイルを開くにはどうすればよいでしょうか。

以前は、次のようにして Fortran を使用して Fortran バイナリを開くことができました。

open(id,file=file_name,status='old',
     +     form='unformatted',access='direct',recl=4,iostat=ok)
      if (ok .ne. 0) then
        write(1,20) id,ok,file_name
                else
        write(1,21) id,file_name

しかし、Fortran ヘッダー情報を持たないフラットなバイナリ ファイルの場合、これはどのように変化するのでしょうか? さらに重要なことは、これらの用語をより詳細に説明するための適切なリンクがどこにあるstatusformです。accessrecl

4

4 に答える 4

12

私はこれをするのが嫌いですが、この投稿で答えを見つけたいと思っていたら、先の道がはっきりしないと感じています. ですから、ここに進むべき道があります。

ショートバージョン

Fortran 77/90 では、標準の Fortran バイナリ ファイルを開くには、次のように記述します。

OPEN (5, FILE="myFile.txt")

しかし、Fortran 以外のフラットなバイナリ ファイルを開くには、次のように記述する必要があります。

OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1)

この違いは、Fortran スタイルのバイナリ ファイルには、ファイル内の各「レコード」の周りに 4 バイトのヘッダーとフッターがあるためです。これらのヘッダー/フッターは、レコードに含まれるデータのサイズを表します。(最も一般的なケースでは、遭遇する各バイナリ ファイルには 1 つのレコードしかありません。)

ロングバージョン

Fortran は多くのデフォルトopen引数を想定しています。実際、元の例を次の詳細な形式で記述して、想定されたすべてのデフォルトを表示できます。

OPEN (5, FILE="myFile.txt") 
OPEN (5, FILE="myFile.txt", FORM="FORMATTED", 
     +   ACCESS="SEQUENTIAL", STATUS="UNKNOWN")

各引数を見てみましょう。

  • FORMは、ファイルがテキスト ( form='formatted') またはバイナリ データ ( form='unformatted') で構成されているかどうかを定義します。

  • ACCESSは、ファイルからデータを順番に読み取るaccess='sequential'か ( )、任意の順序で読み取るか ( ) を定義しますaccess='direct'

  • RECLは、各レコードに入るバイト数を定義します。たとえばrecl=1、レコード長はそれぞれ 1 バイトであるとだけ言っています。おそらく、それらは 1 バイトの整数です。

  • STATUSは、ファイルが既に存在するかどうかを定義します。引数は、ファイルがまだ存在しない可能性があるSTATUS="UNKNOWN"ことを意味しますが、存在しない場合は作成されます。古いファイルを上書きする可能性を防ぎたい場合は、次を使用しますSTATUS="OLD"。同様に、ファイルがまだ存在しないことがわかっている場合は、次を使用する必要がありますSTATUS="NEW"

詳細については:

これらの open ステートメントは、後続の read/write/close ステートメントにも影響を与えます。最初の投稿で、直接アクセス ファイルを開く場合は、直接アクセス ファイルに書き込む必要があることを知っておく必要がありました。(つまり、バイナリに含まれる Fortran ヘッダー/フッターはありません。) ただし、Fortran の既定の機能は、Fortran ヘッダーとフッターが含まれるシーケンシャル アクセス ファイルを作成することです。

openFortran 77/90 のステートメントの詳細については、次のオンライン リソースを参照してください。

Bishop University の Lin Jinsen による素敵なページ(ありがとうございます)。

コンパイラーに関する IBM の公式文書を少し追加したものです。

于 2012-04-04T19:34:38.003 に答える
5

1 つの注意点は、reclデフォルトで指定されたレコード長が、書式設定されていないレコードを含む 4 バイトの単語の数であることです (少なくとも Intel コンパイラでは、bytereclそれ以外を指定するために使用します)。そのため、コンパイラ オプションを指定するか、 を使用する必要がありますrecl=1

コードがそのままの状態でフォーマットされていない直接コードを使用している場合、データを適切に読み取るために必要なことは、適切なレコード長を選択することだけです。ただし、一部の FORTRAN コンパイラは、フォーマットされていないバイナリ ファイルを常に適切に処理するとは限らないため、今後はHDF5を採用することをお勧めします。

利用可能な場合、コンパイラは次のことを許可する場合がありますrecordtype='stream'

open (id, file=file_name, status='old', form='unformatted' &
        , access='stream', iostat=ios)
! read (id, pos=1) someValue
于 2012-04-03T17:41:11.837 に答える
1

ストリーム アクセスを使用できない場合は、直接アクセスを使用する必要があります。この質問への回答のリンクを参照してください。

于 2012-04-03T19:53:08.350 に答える
1

openFortran 2003 で新しいストリーム IO モードを使用するように指示できますaccess='stream'

于 2012-04-03T17:38:19.333 に答える