3

Fortran コードで生成されたバイナリ ファイルがあります。このファイルには double の配列が含まれています。これを C プログラムで開き、通常の配列と同じように操作する必要があります。

どうすればいいのですか?

double型はバイナリファイルでどのように表されますか?

4

3 に答える 3

7

ほとんどすべての Fortran コンパイラは、フォーマットされていない (つまり、バイナリの) シーケンシャル ファイルの場合、各レコードの先頭と末尾にレコードの長さを書き込みます。通常、長さは 4 バイトで記述されますが、8 バイトを使用するコンパイラもあります。レコードは、単一の Fortran 書き込みステートメントで書き込まれるすべてのものです。この配列がこのタイプのファイルを使用して単一の Fortran 書き込みステートメントで書き込まれた場合、4 または 8 バイトをスキップする必要があり、次に配列、さらに 4 または 8 バイトが追加されます。16 進エディタでファイルを表示すると、おそらくこれを理解できます。配列が複数の write ステートメントで分割されて (たとえば、列または行ごとに) 書き込まれた場合、各レコードはこの構造になります。

ファイルがフォーマットなしで Fortran によって書き込まれる場合、Fortran の double 型はそのコンピューターのバイナリ表現で書き込まれます。同じタイプのコンピューターで C で読むことができるはずです。言語だけでなくアーキテクチャを変更する場合、バイナリ表現が異なる可能性があります。

Fortran には、レコード長情報を含まない他のファイル アクセス方法があります。たとえば、直接アクセスします。ストリーム アクセスの新しい方法は、言語間の互換性のために設計されています。

配列が多次元の場合、Fortran は列優先の配列を持ち、C は行優先を使用するため、配列を転置したい場合があります。

関連する質問: Fortran 形式のないファイル形式Python での Fortran 形式のないファイルの読み取り

于 2013-03-03T20:23:59.937 に答える
1

原則としてできません。

Fortran バイナリ ファイルの形式は規定されていません。つまり、プログラムの状態を Fortran バイナリ ファイルに保存し、同じ Fortran 実装を使用してそれを再度開くことはできますが、別の Fortran 実装を使用しても確実にそうすることはできません。

現在、状態を正常に保存できる方法は限られています。そのため、特定の Fortran バイナリ ファイルの構造を十分に詳細に把握して、ファイルを開くことができる可能性は十分にあります。 C プログラムを作成し、内容を読み取ります。ただし、その知識は問題の Fortran コンパイラに完全に固有のものです。

したがって、最善の方法は、たとえば を含む Fortran 配列を作成し、[0, 1, 2, 3, 4, 256, 65536, 65537, 1e10, 1e20, 1e30, 1e40]それをバイナリ ファイルに書き込み、バイナリ エディタでそれを調べてそこに何があるかを確認することです。

後は独りぼっちだな……。

于 2013-03-03T20:15:45.910 に答える
1

私の意見では、fortran バイナリを読み取るより良い方法は、実際には fortran から読み取り配列を Cに渡すことです。それはあなたに多くの苦痛を救うことができます。

  1. このバイナリを実際に読み取ることができるサブルーチンを作成します
  2. サブルーチンをラップして C から呼び出します。

最も難しい部分は、Fortran サブルーチンをラップすることです。名前マングリングは、C と fortran の間では簡単ではありません。これは、使用するコンパイラ (つまり、プラットフォーム) と Fortran のバージョンによって異なります。簡単な例については、こちらこちらをご覧ください。

最初の選択肢は、適切なコンパイル オプションを使用して「手動」で行うことです。

ヒント: マングリングを知るには、Linuxで nmコマンドを使用するか、DLL エクスポート ビューアーのようなツールを使用します。

より良い選択は、この種の操作を処理するのに役立つモジュールiso_c_bindingを導入するFortran 2003を使用することです。

于 2013-03-05T12:53:40.783 に答える