1

Fortran コードによって生成されたバイナリ ファイルを (C++ プログラムで) 読み取る際の問題は、何度も質問されており、Fortran レコードの規則について満足のいく説明が提供されています (例: http://local.wasp.uwa.edu.au/~pbourke )。 /dataformats/fortran/ )

ただし、C++ プログラムを実装しようとすると、fortran の規則を念頭に置いても機能しません。ここでは、バイナリ ファイル "test.bin" に 1 つの整数が含まれており、fortran ルーチンによってバイナリ形式で書き込まれていると仮定します。これをC ++で読み取ろうとする方法は次のとおりです。

#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ifstream file;
  file.open("test.bin", ios::in|ios::binary);
  if (file.is_open())
  {
    int ival;
    file >> ival >> ival;  cout<< ival<<endl;
   }
   return 0;
}

ここで、二重の >>ival 構造は最初に fortran レコードのヘッダー (レコードのサイズをバイト単位で含む) を読み取り、2 番目の >>ival は値を抽出することになっています。ファイルに書かれている整数は 8 ですが、プログラムは 0 を出力するので、データを正しく読み取れません。

バイナリ ファイルの内容は次のとおりです: ^D^@^@^@^@^@^@^@^H^@^@^@^D^@^@^@^@^@^@^@

だから私の質問 - 私は何を間違っていますか?

16 進エディタの表示内容は次のとおりです。

0000000: 0400 0000 0000 0000 0800 0000 0400 0000  ................
0000010: 0000 0000 0a                             .....

それが何を意味するのか分かりますか?

4

2 に答える 2

2

operator>>フォーマットされた入力演算子です。テキストファイルを読み取り、テキスト表現をバイナリに変換するために使用されます。

フォーマットされていない入力操作を使用して読み取る必要があります。これを試して:

file.read(reinterpret_cast<char*>(&ival), sizeof ival);

もちろん、それを読んだ後、正しいエンディアン表現のためにバイトスワップが必要になる場合があります。

于 2012-04-17T19:55:53.537 に答える
1

それを 16 進エディタで開き、構造を掘り下げます。ヘッダー サイズは 16、32、64、または 128 ビットで、最終的にはどれになりますか?

16 進エディタ..

于 2012-04-17T19:23:02.287 に答える