2016-12-31 190 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