2012-04-16 11 views
1

私はCで書かれたバイナリファイルを持っていて、それをjavaで読みたいと思います。私はBinaryFileクラスhttp://www.heatonresearch.com/code/22/BinaryFile.javaを使用して、私はこれを行うJavaでは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); 
} 

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型のために働いていない私はこのようなCでファイルを書きました。私はどのように文字列を書くことができますか?

答えて

1

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

size_t len = strlen(name); 
write_int(file, len); 
fwrite(&name, len, sizeof(char), file); 
+0

を私はCコードでこれをやったとのparams( "テスト名"、44で私の関数を呼び出します)しかし、私はこれを行うときにjava: 'System.out.println(" + length + ">" binaryFile.readFixedString(length)); '私はこれを持っています:> 8>?@ – jadou

+0

@khelch I文字列を読む前に長さを読んでいるとします。 – dasblinkenlight

+0

はい私はSystem.outの前に 'int length =(int)binaryFile.readDWord();'を持っています – jadou

1

"int"注意が必要です。 Javaで

intは常に32ビットであるので、CでCで、それは16,32,64ビット

1

かもしれないこれは間違っている:

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

これは文字だけの数を書きますあなたが出て書きたいサイズが固定されている場合は、通常4

ポインタの大きさに対応する(Javaコードは、64個の文字を見込んのように見えます)、あなたはLog()に何とかそのサイズを渡す必要があります。

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

1

あなたfwrite文は正しく表示されません:あなたは、実際に何かしたい

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

fwrite(name, sizeof(TCHAR), strlen(name) + 1, file); 
+1

あなたがそのルートに行くなら、 'sizeof(* name)'を 'sizeof(TCHAR)'に置き換えて使用してください。これは明確で、 'name'の型が変わっても引き続き動作します。 –

関連する問題