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

标签 c++ eclipse gcc fread

我正在尝试读取一个二进制文件,其中包含二进制文件第一行的元素计数。该文件的十进制版本为:

    
    131072
    32.75988
    71.6028
    113.0817173
    .....
    95.6124

My code to read the file is:

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,我用的eclipse是Indigo for Mac。我的 Mac 是 OSX Lion。

最佳答案

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

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

您必须处理的第二个问题是字节序。 http://en.wikipedia.org/wiki/Endianness

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

关于c++ - 使用 fread 读取二进制文件时无法获得正确的元素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9154779/

相关文章:

c# - 将字符串数组从托管代码编码到 native 代码

c++ - 编译器如何根据优先级和关联性来解释这个表达式?

java - 使用 Eclipse 将调试器附加到应用程序

mysql - 使用 eclipse 和 mysql 创建一个简单的登录页面

android - 权限仅授予系统应用程序

gcc - 在没有yum的情况下在CentOS上安装gcc-c++

c++ - 向控制台应用程序发送 Windows 消息

c++ - 使用其索引从 vector 中删除对象

c++ - 当函数采用有符号 int 时,将 float 参数转换为无符号

c - 从内存中读取 Big Endian 并增加内存