2016-12-31 188 views
0
#include <stdio.h> 


int main() 
{ 
    int i,j; 
    FILE *f; 
    f=fopen("./pathto/sth.bmp","rb"); 
    fread(&i,1, 1, f); 
    printf("%d ",i); 
    fread(&j,1, 1, f); 
    printf("%d ",j); 

    return 0; 
} 

我想讀取一個bmp文件的前2個值。我知道他們是66和77。問題是,如果我只讀取第一個值,那麼變量「i」變爲66,這很好。但是,如果我讀第二個值,作爲「j」,那麼「j」變爲77,這是好的,並且「我」採用類似196540的隨機值,並且我不明白爲什麼。所以,如果我讀了第一個值,一切都很好。如果我讀了前兩個值,最後一個值是好的,但第一個修改後,它變成了隨機的一個,像196540閱讀二進制文件問題

+2

爲什麼在讀'字節'大小的值時使用'int'變量?什麼是你使用的平臺上的'sizeof(int)'? –

+2

我懷疑通過'fread(sig,sizeof(sig),1,f)'讀取'unsigned char sig [2]''會更接近你想要的東西,儘管你可能想花時間去閱讀[整個標題](https://en.wikipedia.org/wiki/BMP_file_format#Bitmap_file_header)。 – WhozCraig

+0

應該檢查返回的值(不是調用'fopen()'和'fread()'的參數值,以確保操作成功。 – user3629249

回答

3

當我嘗試你的程序時,我得到了兩個變量的垃圾結果。

問題是你使用了錯誤的類型變量。您正在讀取文件中的單個字節,但您正在將其讀入一個int變量,該變量爲多個字節。因此,它將來自文件的單個字節與隨機數據恰巧處於變量的初始值中。

聲明它們爲char而不是int

#include <stdio.h> 

int main() 
{ 
    char i,j; 
    FILE *f; 
    f=fopen("sth.bmp","rb"); 
    fread(&i,1, 1, f); 
    printf("%d ",i); 
    fread(&j,1, 1, f); 
    printf("%d\n",j); 

    return 0; 
} 
+0

非常感謝,那是問題所在,我嘗試了一些東西類似之前,但我也修改了printf的參數(%s而不是%d)爲什麼這不好? –

+0

'%s'用於打印一個字符串,該字符串是一個以空字節結尾的char數組如果你想看到字符而不是ASCII碼,可以使用'%c' – Barmar

+0

@LazuRazvan:注意,打印出字符而不是十進制值只對非常有用BMP文件中的前2個字節,其餘全部是二進制數據。 – usr2564301