2012-02-06 55 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

有些库可以帮助你,但是以跨平台的方式读取各种二进制数据并不是微不足道的。

相关问题