- ベストアンサー
白黒ビットマップの表示
はじめて質問させていただきます。勉強を始めて5ヶ月目の初心者ですのでどうぞよろしくご教示願います。 テキストファイルに16進数で書かれている数字をバイナリモードで読み込み「BITMAP」という文字を見つけたら「□」と「■」を使って数字の横に白黒ビットマップの表示を始め、「ENDCHAR」という文字を見つけたら終了するというプログラムを作っています。 読み込みたいファイルはこのようなものです。 STARTCHAR 2421 ENCODING 9249 SWIDTH 480 0 DWIDTH 7 0 BBX 7 7 0 -1 BITMAP 0000 0000 2000 f800 7000 b800 6800 ENDCHAR 最後に読み込みに成功したかをフラグを立てて判断するようにしたいです。ファイルを読み込むことはできましたがそれ以上がどうしても書けません。どなたかお分かりになる方いらっしゃいましたらよろしくお願い致します。 開発環境は WindowsXP VisualC++V6.0です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★行単位ではファイルを読み込めるのですよね。 ・それならば、行単位で読み込んだ文字列を1行ずつ調べていきます。 おおよそのアルゴリズムは (1)行単位で文字列を取得します。→『fgets』関数など (2)『BITMAP』文字列を探します。→『strcmp』関数などで比較 (3)『BITMAP』文字列以降の文字列は16進文字列なのでこれを整数に変換します。→『strtol』関数など (4)変換した整数を1ビットずつ調査して、ON/OFFを■/□で出力します。→ビットANDする(&)演算子 (5)『ENDCHAR』文字列が見つかったらば処理を終了します。 となります。 ・16進数の文字列を整数に変換する方法は『strtol』関数や『strtoul』関数を利用します。 まぁ、とにかく下のサンプルをどうぞ。 サンプル: char buff[ 256 ]; int flag = 0; ←フラグ while ( fgets(buff,sizeof(buff),fp) != NULL ){ if ( !strcmp(buff,"ENDCHAR\r\n") ){ break; ←おわり } if ( flag ){ /* ここに16進文字列を整数に変換して、ON/OFFの状態を■/□で出力します。 */ } else if ( !strcmp(buff,"BITMAP\r\n") ){ flag = 1; ←次の行からは16進文字列を解釈するためにセット } } if ( flag ){ ←ここで『読み込みに成功したかのフラグを判断』しています。 printf( "成功。\n" ); } else{ printf( "失敗!\n" ); } 最後に: ・16進文字列を整数に変換する『strtol』関数の使い方は long strtol( const char *str, char **endptr, int base ); ですので『value = strtol( buff, NULL, 16 );』とすると value 変数に変換された整数が 格納されます。value は long 型です。int 型変数に代入する場合はキャストして下さい。 ・整数から1ビットのON/OFFを調べるにはビットANDの(&)演算子を使います。 value & 0x0001⇒1ビット目のON/OFFが分かる value & 0x0002⇒2ビット目のON/OFFが分かる value & 0x0004⇒3ビット目のON/OFFが分かる value & 0x0008⇒4ビット目のON/OFFが分かる これをシフト演算と組み合わせるとループ文などで記述できます。 for ( i = 0 ; i < 16 ; i++ ){ ←16ビットを処理するので16 if ( value & 0x8000 ){ ←最上位のビットを調査 /* ビットON→■を出力 */ } else{ /* ビットOFF→□を出力 */ } value <<= 1; ←左シフト } ・以上。参考に!
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
"BITMAP" と "ENDCHAR" に挟まれた部分を printf するプログラムは書けますか? それができれば、あとは各行を2進変換するだけですが。
補足
ご回答ありがとうございます。 お恥ずかしながらそれを書くこともできず未だ苦闘しております…。 いろいろ調べているのですがよくわかりません。
お礼
ご回答&サンプルをありがとうございます! まだまだ理解できていない部分もありますがこちらを参考に頑張ってみます!
補足
無事動かすことができました!!本当にありがとうございます。 また質問させていただくことがあると思いますがその時はまたよろしくお願いいたします。