2012-04-16 25 views
1

我有一個用C編寫的二進制文件,我想用java讀取它。我寫的文件用C這樣的:閱讀從C用Java編寫的文件

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中我用http://www.heatonresearch.com/code/22/BinaryFile.javaBinaryFile類和我這樣做:

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它的工作原理。我如何寫字符串?

回答

1

這是因爲sizeof(name)是你係統上指針char的大小,不是這個字符串的長度。你也需要從字符串中分別寫出長度。

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

我這樣做的C代碼,調用我的函數使用參數( 「測試名」,44 )但在Java中,當我這樣做:''System.out.println(「>」+長度+「>」+ binaryFile.readFixedString(長度));'我有這個在:> 8>?@ – jadou 2012-04-16 16:03:44

+0

@khelch我假設你在閱讀字符串之前閱讀了長度,對吧? – dasblinkenlight 2012-04-16 16:09:47

+0

是的,我有這條指令'int length =(int)binaryFile.readDWord();'在System.out之前 – jadou 2012-04-16 16:18:07

1

您必須小心輸入「int」。

INT在Java總是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的類型改變,它將繼續工作。 – 2012-04-16 15:17:00