2012-04-03 8 views
5

私は長年Fortranで作業してきましたが、ファイルI/Oはまだまだぼんやりしています。私はstatusformaccessreclの私の理解は、が必要なので、制限されています大学院の特定の使用例。
私は、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のヘッダー情報を持たないフラット、バイナリ・ファイルのため、この変更はありません?さらに重要なことは、これらの用語をより詳細に説明する良いリンクはどこにありますか:status,form,access,recl

+0

"C++"というバイナリは、C++プログラムで書かれた生のフラットなバイナリファイルを意味します。ファイル形式は...何であろうと、1バイトの整数の行と列で埋められたフラットなバイナリです。明らかに、私の主な関心事は、ファイルに通常のFortranヘッダがない場合、Fortranでバイナリファイルを読み込もうとしていることです。 – theJollySin

+0

それを作成した言語はまったく無関係で、あなたの実際の問題から逸脱しています。それを編集し、C++タグを削除しました。 – Mat

+0

それは公正だと思われる。私はタイトルとテキストにそれを入れて、これが私が読もうとしていた通常のFortranバイナリであることをうまく強調しています。それがまだ明らかである限り、私は満足しています。 – theJollySin

答えて

8

私はこのことを嫌っていますが、私はこの記事で答えを見つけたいと思っていれば、今後の道ははっきりしないだろうと思います。それでは、ここに道があります。 Fortranの90分の77で

ショートバージョン

は、あなたが書いたかもしれない標準のFortranのバイナリファイルを開くために:あなたを

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

をしかし、フラット、非Fortranのバイナリファイルを開くことでしょう

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

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

ロングバージョン

Fortranは、デフォルトopen引数の多くを前提としています。実際、元の例は、想定されていたデフォルトをすべて表示するために次のような形式で記述することができます。

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

私たちは、それぞれの引数を見てみましょう:ファイルがテキスト(form='formatted')またはバイナリデータ(form='unformatted')で構成されている場合

  • FORMを定義します。ご注文(access='sequential')内のファイルからデータを読んでいるか、どのような順序であなたが(access='direct'を)したい場合

  • アクセスを定義します。

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

  • ステータスは、ファイルがすでに存在するかどうかを定義します。 STATUS="UNKNOWN"引数は、ファイルがまだ存在しない可能性があることを意味しますが、作成されない場合は作成されます。古いファイルを上書きする可能性を防ぐには、STATUS="OLD"を使用します。同様に、ファイルがまだ存在しないことがわかっている場合は、STATUS="NEW"を使用します。詳細情報

:これらのオープン文も続く読み取り/書き込み/ close文に影響を及ぼし

。オリジナルの投稿では、直接アクセスファイルを開くと、直接アクセスファイルに書き込む必要があることを知る必要がありました。 (つまり、バイナリにFortranヘッダー/フッターは含まれません)。しかし、Fortranのデフォルトの機能は、Fortranヘッダーとフッターを含む順次アクセスファイルを作成することです。 Fortranの90分の77でopen文の詳細については

、良いリソースがオンラインにあります。ビショップ大学の林Jinsenによって

A nice page(ありがとうございました)。

Slightly more official documentationこれはコンパイラのためです。

1

openには、Fortran 2003の新しいStream IOモードをaccess='stream'で使用するように指定できます。

+0

ああ、それは素晴らしいだろう、はい。しかし、私はFortran 77を使用して立ち往生しています。 – theJollySin

+4

どのようにFortran 77に固執することができますか?F90をコンパイルすることはできません。 – haraldkl

+1

@haraldkl - しかし、多くの無知なユーザーが、新しいリビジョンを習得することを拒否し、F77を主張しているが、愚かなことがあるかもしれない。なぜFortran IVではない、私はいつも頼む? – Rook

5

あなたはコンパイラオプションや使用を指定する必要がありますので、1つの警告は、未フォーマットのレコードを持つ4バイトワードの数にreclデフォルトで与えられたレコード長(少なくともインテル®コンパイラーで、特に指定し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 
+0

reclは、Intelコンパイラの場合、デフォルトで4バイトの単語になるように指定してくれてありがとうございます。私はそれがIntelのドキュメントで不思議なことに言及されていないことが分かりました。 – umbersar

関連する問題