C言語ケーススタディ ファイルダンプコマンドの作り方1




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



ファイルの内容を16進数で表示するダンプコマンドと同じ機能のプログラムを作成します。 StudyCにもダンプコマンドが用意されているので最終的にはそれと同じ動作をするプログラムを作成します。 まず、StudyCのダンプコマンドを実行してみてください。コマンドモードでdump fileと入力すれば実行できます。
dump hello.c

---------------hello.c--------------
00000000  6D 61 69 6E 28 29 0D 0A-7B 0D 0A 09 70 72 69 6E   main()..{...prin
00000010  74 66 28 22 68 65 6C 6C-6F 22 29 3B 0D 0A 7D 0D   tf("hello");..}.
00000020  0A 1A                                             ..

最初にファイルの内容をファイルから1文字づつ読み込み16進数で表示するプログラムを作成します。
このプログラムのポイントはfopenで"rb"と指定している点です。bを付加するとバイナリモードでファイルをオープンします。 bを付けないとテキストモードでオープンしてしまい、改行文字(0D、0A)を単に0Aと変換してしまったり1Aを見つけるとそこでEOFを返してしまいます(bを付けない場合の動作も観察してみてください)。 当面ファイルにはhello.cというファイルを使うので無い場合は作成しておいてください。
#include <stdio.h>

main()
{
        FILE    *fp;
        int     data;

        fp = fopen("hello.c", "rb");
        if(fp == NULL){
                printf("ファイルがオープンできません.\n");
                return;
        }

        for(;;){
                if((data = getc(fp) ) == EOF){
                        break;
                }
                printf("%02X ", data);

        }
        fclose(fp);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
次にダンプ結果を16バイトづつ区切って表示するように変更します。 forループを2重にして内側のループは16バイトづつ表示するようにします。
#include <stdio.h>

main()
{
        FILE    *fp;
        int     data;

        int     i1;

        fp = fopen("hello.c", "rb");
        if(fp == NULL){
                printf("ファイルがオープンできません.\n");
                return;
        }
        for( ; ; ){
                for(i1 = 0; i1 < 16; i1++){
                        if((data = getc(fp) ) == EOF){
                                printf("\n");
                                fclose(fp);
                                return;
                        }
                        printf("%02X ", data);
                }
                printf("\n");
        }
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
次に左端の何倍と目かを表示します。 addrという変数(unsigned long型で宣言していますが、まだ知らない方はint型でもかまいません)を用意して外側のforループでつづ加算していきます。 また、内側のforループの開始前にその内容を表示するようにします。
#include <stdio.h>

main()
{
        FILE    *fp;
        int     data;

        int     i1;

        unsigned long
                addr;

        fp = fopen("hello.c", "rb");
        if(fp == NULL){
                printf("ファイルがオープンできません.\n");
                return;
        }
        for(addr = 0; ; addr += 16){
                printf("%08lX  ", addr);

                for(i1 = 0; i1 < 16; i1++){
                        if((data = getc(fp) ) == EOF){
                                printf("\n");
                                fclose(fp);
                                return;
                        }
                        printf("%02X ", data);
                }
                printf("\n");
        }
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
これでだいぶdumpコマンドらしくなってきました。続きは次回説明します。