2012-02-06 66 views
0

我正嘗試讀取二進制文件第一行元素數的二進制文件。該文件的小數點的版本是:當讀取fread二進制文件時無法獲得正確的元素數

  
    131072 
    32.75988 
    71.6028 
    113.0817173 
    ..... 
    95.6124 

我的代碼讀取該文件是:

char TextName1[] = "BinaryArrayWithLength.bin"; 
FILE *InFile; 
InFile = fopen("BinaryArrayWithLength.bin", "rb"); 
if(InFile == NULL) 
{ 
     printf("Read Error\n"); 
     return 0; 
} 
else 
{ 
     fread(Length, sizeof(int), 1, InFile); 
} 
printf("%d\n", *Length); 

的問題是我能得到正確的長度是131072,如果我在Eclipse編譯它。如果我用gcc編譯我的代碼,我得到的編號是168430090. 我猜這個問題是由不同的編譯器造成的。我的gcc版本是4.2.1。我使用的Eclipse是Indigo for Mac。我的Mac是OSX Lion。

+1

什麼是「長度」?你爲什麼在C++中使用'fopen'和family? – 2012-02-06 01:46:04

+0

這不可能是您的完整代碼。什麼是「長度」? – Borealid 2012-02-06 01:46:04

+2

「(...)**二進制**文件的第一行**。」你必須做出決定。它可以是二進制文件,也可以是文本文件(即帶有行)。 – 2012-02-06 01:49:07

回答

1

二進制文件是非常特定於平臺的(與一般的二進制數據一樣)。有時它也是編譯器特定的。簡單地讀取原始二進制數據爲一個整數不會是一個跨平臺的解決方案。

對於初學者來說,sizeof(int)在所有平臺上都不是相同的。它可能在一個平臺上是16位,在另一個平臺上是32位,在另一個平臺上是64位。僅僅爲了練習,你應該在你的程序中打印出sizeof(int)來查看你的本地版本和你的遠程gcc版本是否不同。

你必須處理的第二個問題是endianness。 http://en.wikipedia.org/wiki/Endianness

有些庫可以幫助你,但是以跨平臺的方式讀取各種二進制數據並不是微不足道的。