4

たとえば、CIには次の構造があります。

typedef struct {
    int number;
    double x1;
    double y1;
    double x2;
    double y2;
    double x3;
    double y3;
} CTRstruct;`

次に、それをファイルに書き込みますfwrite(&tr, 1, sizeof(tr), fp);(tr-そのCTRstruct var、fp-ファイルポインター);

それから私はそれをJavaで読む必要があります!私は本当にファイルから構造体を読み取る方法を知りません...私はそれをで読み込もうとしましたObjectInputStream()、最後のアイデアはで読むことRandomAccessFile()ですが、私も方法がわかりません...(readLong(), readDouble()これも機能しません、それはコースで機能しますただし、正しいデータは読み取れません)。では、JavaでバイナリファイルからC構造体を読み取る方法はありますか?


面白い場合は、整数を読み取るための私のバージョン(しかし、それは醜いです、そして私は何をすべきかわかりませんdouble):

パブリッククラスMyDataInputStreamはDataInputStreamを拡張します{

public MyDataInputStream(InputStream AIs) {
    super(AIs);
}

public int readInt1() throws IOException{
    int ch1 = in.read();
    int ch2 = in.read();
    int ch3 = in.read();
    int ch4 = in.read();
    if ((ch1 | ch2 | ch3 | ch4) < 0)
        throw new EOFException();
    return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0));
}

doubleを使用すると、同じ方法で処理できます(intまたはlong(8bytes)を使用してから、ネイティブ関数を使用してdoubleに変換します)。

4

6 に答える 6

5

必然的にパディングエンディアンfwriteで問題が発生するため、全体を使用しないでください。C 側は、コンパイラがパフォーマンスなどのために入れたすべてのギャップを含めて、メモリ内のすべての方法をダンプします。それは「非移植性の母」です!structstruct

代わりに、プロトコル バッファ、JSON、またはその他の移植可能なシリアライゼーション手段を使用して、タスクを実行する必要があります。

于 2012-04-15T14:38:41.530 に答える
4

データをディスクにシリアル化するライブラリを使用します。これにより、Java への読み込みがずっと簡単になります。ライブラリが十分に文書化されたストレージ形式を使用していることを確認してください。

于 2012-04-15T14:42:29.173 に答える
2

プログラムを実行したアーキテクチャで使用されているCタイプ(int、double)とエンディアン(thanks andrew Cooke)を調べ、Javaで同じサイズのタイプを使用する必要があります。

于 2012-04-15T14:32:19.513 に答える
1

万が一、JNIがオプションである場合は、Cで読み戻すことができます。swigを使用すると、ファイルから読み取る関数とともに、構造体を簡単に公開できます。もちろん、JNIに伴うすべての面倒は、この問題だけでは価値がありませんが、すでに使用している可能性があります。

于 2012-04-15T14:53:03.160 に答える
1

DataInputStreamJavaでプリミティブ入力を読み取る典型的な方法です-できるはずだと思います

int number = dataInputStream.readInt();
double x1 = dataInputStream.readDouble();
...
double y3 = dataInputStream.readDouble();

しかし、エンディアンやその他の問題に互換性があるかどうかは 100% 確信が持てません。

于 2012-04-15T14:33:31.347 に答える