2016-12-31 19 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になります。しかし、もし私が第2の値を "j"として読むと、 "j"は77になり、 "i"は196540のようなランダムな値をとります。だから、もし私が最初の値を読んだら、大丈夫です。私は最初の2つの値を読み取る場合は、最後の値は良いですが、最初の修正は、それがバイナリファイルの問題から読む

+2

なぜ、 'byte'サイズの値を読み込んでいるときに' 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

私は両方の変数のためのごみ結果を得るあなたのプログラムを試してみてください196540のようなSTH、ランダムなものとなります。

問題は、あなたが間違った型変数を使用していることです。あなたはファイルから1バイトを読み込んでいますが、それを複数バイトの変数intに読み込んでいます。これは、ファイルの1バイトを、変数の初期値にランダムなデータが含まれているものと組み合わせます。

charの代わりintとしてそれらを宣言します。

+0

どうもありがとう、問題だった、私は何かを試してみましたprintfの引数を%dの代わりに%sに変更していたのはなぜですか? –

+0

'%s'はヌルバイトで終わる' char'の配列である文字列を出力するためのものですASCIIコードの代わりに文字を見たい場合は、 '%c'を使用してください。 – Barmar

+0

@LazuRazvan:10進数ではなく文字を出力することは、 BMPファイルの最初の2バイト。残りはすべてバイナリデータです。 – usr2564301

関連する問題