2011-05-31 124 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(檢查,...)。

希望這會有所幫助!