2011-05-31 158 views
0

所以我正在尝试读取已提供的文件系统磁盘。正在读取二进制文件

所以,我想要做的是从文件系统读取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,其不断变化,每次我运行该文件,但我得到负值。我不明白我做错了什么。我是否正确地读取磁盘的字节并将其打印出来?

我基本上想要做的是读取磁盘的字节,并读取特定字节的值。这些字节是帮助我理解磁盘结构/格式的字段。

任何帮助,将不胜感激。 谢谢。

+1

对于二进制文件,你不需要''rb“'而不是''r”'吗? – Mehrdad 2011-05-31 01:11:57

+0

在Windows上,是的。在Linux或Unix上,不管,但无论如何可移植性可能是一个好主意(以防代码稍后在Windows上使用)。 – MRAB 2011-05-31 01:51:48

回答

1

这条线:

int check[sizeof(char)*4]; 

分配的4个整数的数组。

类型检查的是因此INT *,所以这条线:

printf("%d",check); 

打印的数组的地址。

你应该做的是给它分配一个int:

int check; 

,然后FREAD进去:

fread(&check, 1, sizeof(int), fp); 

(此代码,顺便说一下,假定int是4个字节)。

+0

这应该是fread(* check,1,sizeof(int),fp); &是解除引用操作符。 – 2011-05-31 01:40:54

+0

如果check是一个int,那么&check就是该int的地址。如果check是int *(指向int的指针),那么* check是该地址处的int。 – MRAB 2011-05-31 01:52:33

+0

你说得对,我很愚蠢。 *叹息......一天过得太长了。我也在下面编辑了我的答案。 – 2011-05-31 01:56:08

1
int check[sizeof(char)*4]; //creates a buffer array 4 bytes long 

这是不正确的。您正在创建一个由四个整数组成的数组,每个整数通常为32位,然后当您printf(“%d”,检查)时,您正在打印该数组的地址,每次运行程序时该地址可能会发生变化。我想你想要的是:

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的更改(&检查,...)。 fread的第一个参数是要读取数据的缓冲区地址(在本例中为单个整数)。

请记住,虽然整数可能是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"); 
    } 
} 

在这种情况下,检查(不带括号)是一个指向数组的指针,这就是为什么我已经将fread改回fread(检查,...)。

希望这会有所帮助!