1

Cで書かれたバイナリファイルがあり、Javaで読みたいです。私はこのようにCでファイルを書きました:

void Log(TCHAR *name,int age){
    write_int(file, 2012);
    write_int(file, 4);
    write_int(file, 16);
    write_int(file, 12);
    write_int(file, 58);
    write_int(file, 50);

    fwrite(&name, sizeof(name), 1, file);
    fwrite(&age, sizeof(age), 1, file);
    fflush(processusFile);
}

Javaでは、BinaryFileクラスhttp://www.heatonresearch.com/code/22/BinaryFile.javaを使用し、これを実行します。

RandomAccessFile f = new RandomAccessFile("myfile.dat", "r");
BinaryFile binaryFile = new BinaryFile(f);
ArrayList<String> text = new ArrayList<>();
while (true) {
try {
    Calendar calendar = new GregorianCalendar();
    int year = (int) binaryFile.readDWord();
    int month = (int) binaryFile.readDWord();
    int date = (int) binaryFile.readDWord();
    int hourOfDay = (int) binaryFile.readDWord();
    int minute = (int) binaryFile.readDWord();
    int second = (int) binaryFile.readDWord();

    calendar.set(year, month, date, hourOfDay, minute, second); 
    System.out.println(binaryFile.readFixedString(64));    
    catch (Exception e) {
        break;  
    }
}

これはchar*では機能しませんが、intでは機能します。文字列を書くにはどうすればよいですか?

4

4 に答える 4

1

これは、文字列の長さではなく、システム上のポインタsizeof(name)のサイズであるためです。文字列とは別に長さも書き出す必要があります。char

size_t len = strlen(name);
write_int(file, len);
fwrite(&name, len, sizeof(char), file);
于 2012-04-16T14:49:13.663 に答える
1

タイプ「int」に注意する必要があります。

Javaのintは常に32ビットですが、Cではそうではありません。Cでは16,32,64ビットの場合があります。

于 2012-04-16T14:49:23.680 に答える
1

これは間違っています:

fwrite(&name, sizeof(name), 1, file);

これは、ポインタのサイズに対応する文字数(通常は4)のみを書き込みます。

書き出すサイズが固定されている場合(Javaコードは64文字を想定しているように見えます)、そのサイズをなんらかの方法でに渡す必要がありますLog()

Log()Cには、関数内から最初の引数として渡された(された可能性のある)配列のサイズを把握する方法がありません。そのため、明示的にする必要があります。

于 2012-04-16T14:49:23.670 に答える
1

あなたのfwrite声明は正しく見えません:

fwrite(&name, sizeof(name), 1, file);

あなたは実際に次のようなものが必要です:

fwrite(name, sizeof(TCHAR), strlen(name) + 1, file);
于 2012-04-16T14:50:06.770 に答える