在使用fread读取二进制文件时无法获得正确的元素数

时间:2012-02-06 01:44:02

标签: c++ eclipse gcc 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);

问题是如果我在Eclipse中编译它,我可以得到正确的长度131072。如果我使用gcc在终端中编译我的代码,我得到的数字是168430090。 我想问题是由不同的编译器引起的。我的gcc版本是4.2.1。我使用的是Indigo for Mac。我的Mac是OSX Lion。

1 个答案:

答案 0 :(得分:1)

二进制文件非常特定于平台(与二进制数据一样)。有时它也是特定于编译器的。简单地将原始二进制数据读取为整数不会成为跨平台解决方案。

对于初学者来说,sizeof(int)并不是所有平台都相同的东西。它可能在一个平台上为16位,在另一个平台上为32位,在另一个平台上为64位。只是为了练习,你应该尝试在程序中打印sizeof(int),看看你的本地版本和你的远程gcc构建之间是否有所不同。

你需要处理的第二个问题是字节顺序。 http://en.wikipedia.org/wiki/Endianness

有一些库可以帮助您解决这个问题,但是以跨平台的方式阅读各种二进制数据并不是一件容易的事。