读取二进制文件

| 因此,我正在尝试读取已提供的文件系统磁盘。 因此,我要从文件系统中读取1044个字节。我当前正在执行以下操作:
if (fp  = fopen(\"filesysFile-full\", \"r\")) {
  fseek(fp, 1044, SEEK_SET);        //Goes to 1024th byte
  int check[sizeof(char)*4];        //creates a buffer array 4 bytes long
  fread(check, 1, 4, fp);           //reads 4 bytes from the file
  printf(\"%d\",check);               //prints 
  int close = fclose(fp);
  if (close == 0) {
    printf(\"Closed\");
  }
}
支票应打印的值为1。但是,我得到的负值每次运行文件时都会不断变化。我不明白我在做什么错。我是否采用正确的方法来读取磁盘字节并进行打印。 我基本上想要做的是读取磁盘的字节,并读取某些字节的值。这些字节是有助于我理解磁盘结构/格式的字段。 任何帮助,将不胜感激。 谢谢。     
已邀请:
        这行:
int check[sizeof(char)*4];
分配4个整数的数组。 因此,检查类型为int *,因此此行:
printf(\"%d\",check);
打印数组的地址。 您应该做什么将其分配为int:
int check;
然后读入它:
fread(&check, 1, sizeof(int), fp);
(顺便说一句,此代码假定int为4个字节。)     
        
int check[sizeof(char)*4];    //creates a buffer array 4 bytes long
这是不正确的。您正在创建一个由四个整数组成的数组,每个整数通常为32位,然后在打印printf(\“%d \”,check)时,您正在打印该数组的地址,每次运行程序时该地址可能都会改变。我认为您想要的是:
if (fp  = fopen(\"filesysFile-full\", \"r\")) {
  fseek(fp, 1044, SEEK_SET);         //Goes to 1024th byte
  int check;                         //creates a buffer array the size of one integer
  fread(&check, 1, sizeof(int), fp); //reads an integer (presumably 1) from the file
  printf(\"%d\",check);                //prints 
  int close = fclose(fp);
  if (close == 0) {
    printf(\"Closed\");
  }
}
请注意,您不是声明整数数组,而是声明了一个整数。还要注意从fread(check,...)更改为fread(&check,...)。要读取的第一个参数是要将数据读取到的缓冲区的地址(在这种情况下为单个整数)。 请记住,尽管整数可能长32位,但这并不能保证。同样,在大多数操作系统中,整数是使用最低有效字节先存储在磁盘上的,因此,如果磁盘上的数据在字节1044处看起来像这样,则您只会读取1:
0x01 0x00 0x00 0x00
如果是相反的方式,即0x00 00 00 01,则将其读取为16777216(0x01000000)。 如果要读取多个整数,可以使用如下数组:
if (fp  = fopen(\"filesysFile-full\", \"r\")) {
  fseek(fp, 1044, SEEK_SET);         //Goes to 1024th byte
  int check[10];                     //creates a buffer of ten integers
  fread(check, 10, sizeof(int), fp); //reads 10 integers into the array
  for (int i = 0; i < 10; i++)
    printf(\"%d \", check[i]);         //prints 
  int close = fclose(fp);
  if (close == 0) {
    printf(\"Closed\");
  }
}
在这种情况下,check(不带括号)是指向数组的指针,这就是为什么我将fread改回了fread(check,...)。 希望这可以帮助!     

要回复问题请先登录注册