2016-11-19 4 views
2
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define NBRCOLOURS 16 
#define COLOURSIZE 8 

typedef struct 
{ 
    char colours[COLOURSIZE]; 

}BITMAP; 



//Main Function 
void main(void) 
{ 
    int count, count2; 
    char bm_file[] = "C:\\Coding\\Bitmap Program\\Sample.bmp"; 
    FILE *fptr; 
    char ch; 
    int i = 0; 
    BITMAP bm_data[NBRCOLOURS]; 


    fptr = fopen(bm_file, "rb"); 
    if (fptr != NULL) 
    { 
     while ((ch = fgetc(fptr)) != EOF) 
     { 
      printf("%02X ", ch); 
      if (!(++i % 16)) putc('\n', stdout); 
     } 
    } 

    fclose(fptr); 

    system("pause"); 
    return; 
} 

私はビットマップファイルの内容を16進数の値として読み取るために、ほとんどの場合オンラインであるこのコードを使用しています。何らかの理由で、このコードはヘッダーの最後で停止します。残念ながら、最終的には、どのカラーが表示されるかを数えて、どのカラーが出現するかを調べる必要があります。ビットマップファイルを16進数で読み込もうとしています

ビットマップのヘッダーの最後でこのコードが停止する理由、または残りの16進数のデータをファイルから取り出すことができる理由を誰かが教えていただけたら、本当にありがとう。ここで

が進コードです:

42 4D C6 00 00 00 00 00 00 00 76 00 00 00 28 00 
00 00 0A 00 00 00 0A 00 00 00 01 00 04 00 00 00 
00 00 50 00 00 00 12 0B 00 00 12 0B 00 00 10 00 
00 00 10 00 00 00 FF 00 00 00 00 FF 00 00 00 00 
42 00 5A 5A 84 00 00 00 FF 00 FF 00 FF 00 00 FF 
FF 00 08 FF FF 00 5A FF FF 00 FF FF FF 00 FF FF 
FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 FF FF 
FF 00 FF FF FF 00 92 59 00 16 47 00 00 00 25 90 
01 64 61 00 00 00 59 90 11 64 61 00 00 00 99 00 
16 48 11 00 00 00 90 01 64 61 11 00 00 00 00 16 
64 61 00 00 00 00 01 16 46 10 09 00 00 00 11 64 
41 00 99 00 00 00 16 64 11 09 95 00 00 00 66 48 
10 09 53 00 00 00 

そしてここでは、印刷さです:

42 4D FFFFFFC6 00 00 00 00 00 00 00 76 00 00 00 28 00 
00 00 0A 00 00 00 0A 00 00 00 01 00 04 00 00 00 
00 00 50 00 00 00 12 0B 00 00 12 0B 00 00 10 00 
00 00 10 00 00 00 

ロングポスト、ごめんなさい。どんな助けでも大歓迎です。

+7

'fgetc関数を'は理由のために' int'( 'char'ではなく)を返します。 – melpomene

答えて

3

fgetcは、charではなくintを返します。 charの可能なすべての値が有効なので、EOFをcharで表すことはできません。 EOFはintとして表現される-1と0xfffffffなので、0xffをcharとして読むとEOFと同じです。

変更この:

char ch; 

に:printfでフォーマット指定前

int ch; 
+1

C標準では 'EOF'が負であるとしか書かれていません。しかし、ええ、私はそれを '-1'にしないプラットフォームは見たことがありません。 – melpomene

+1

"EOFを' char'で表現することはできません。 'char'がx86(ARMではなく)のように署名されていて、多くのプラットフォームのように' -1'のように署名されていれば正しくありません。 – Olaf

+0

(分割ヘアセクション:-))charが署名されているかどうかにかかわらず-1をcharにキャストすると-1または255の有効なchar値が生成されます。7ビットのASCIIテキストファイルは区別されます(-1または255は有効な7ビットASCIIではありません)。ただし、符号は重要ではありません。 –

0

数は、%02Xようのみ出力文字の最小数ではなく、最大値を保証します。 fgetcは、charではなく、intを返します。 intが負の2の補数ならば、開始時にFFバイトを含むintを表すビット列全体が出力されます。 EOFcharと表記できません。 intとしてのみ提供されます。

あなたのケースでは、我々は我々が作業しているファイルがバッファにファイル全体を読み込むことは、おそらく成功することは十分に小さいことを知っているので、我々はだけではなく、mallocfreeを使用することができます。

#include <stdio.h> 
#include <stdlib.h> 


typedef unsigned char byte; 

int main(int argc, char *argv[]) 
{ 
    FILE *fp = fopen("C:\\Coding\\Bitmap Program\\Sample.bmp", "rb"); 
    byte *buffer = NULL; 
    size_t len; 
    int i; 

    fseek(fp, 0, SEEK_END); 

    len = ftell(fp); 
    rewind(fp); 

    buffer = malloc(len); 
    if(!buffer) 
    { 
     perror("malloc"); 
     exit(EXIT_FAILURE); 
    } 

    fread(buffer, 1, len, fp); 
    fclose(fp); 
    for(i = 0; i < len; i++) 
    { 
     if(i%16==0) putchar('\n'); 
     printf("%.2X ", buffer[i]&0xFF); 

    } 
    free(buffer); 
    return 0; 
} 
関連する問題