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




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



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                                             ..
今回はダンプコマンドの仕上げを行います。まず、コマンドラインからファイル名を指定できるように変更します。 StudyCユーザーの方は専用講座に、コマンドラインからパラメータを受け取る方法が第18回講座に説明されているので参照してください。
変更点は次のようになります。
(1)main関数の宣言を変更します。
(2)パラメータ数が適切か検査します。
(3)fopenの引数をargv[1]に変更します。
#include <stdio.h>

main(int argc, char *argv[])
{
        FILE    *fp;
        int     data;

        int     i1;

        unsigned long
                addr;

        char    buff[100];

        if(argc != 2){
                printf("コマンドの入力形式が間違っています.\n");
                return;
        }
        fp = fopen(argv[1], "rb");
        if(fp == NULL){
                printf("ファイルがオープンできません[%s].\n", argv[1]);
                return;
        }
        for(addr = 0; ; addr += 16){
                printf("%08lX  ", addr);

                for(i1 = 0; i1 < 16; i1++){
                        if((data = getc(fp) ) == EOF){
                                buff[i1] = '\0';
                                for(;i1 < 16; i1++)
                                        printf("   ");
                                printf("  %s\n", buff);
                                fclose(fp);
                                return;
                        }

                        if(data < 0x20 || data >= 0x7F)
                                buff[i1] = '.';
                        else
                                buff[i1] = data;
                        printf("%02X ", data);
                }
                buff[i1] = '\0';
                printf("  %s\n", buff);
        }
}
Study Cにロードする Study Cにロードし編集する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて... 「run file」のように実行する必要があるので実行ボタンはありません
この変更で、"run ファイル名"という形式でファイル名を指定して実行することができるようになります。
あとは、ちょっとお化粧をしておしまいです。
#include <stdio.h>

main(int argc, char *argv[])
{
        FILE    *fp;
        int     data;

        int     i1;

        unsigned long
                addr;

        char    buff[100];

        if(argc != 2){
                printf("コマンドの入力形式が間違っています.\n");
                return;
        }

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

                for(i1 = 0; i1 < 16; i1++){
                        if((data = getc(fp) ) == EOF){
                                buff[i1] = '\0';
                                for(;i1 < 16; i1++)
                                        printf("   ");
                                printf("  %s\n", buff);
                                fclose(fp);
                                return;
                        }

                        if(data < 0x20 || data >= 0x7F)
                                buff[i1] = '.';
                        else
                                buff[i1] = data;

                        if(i1 == 7)
                                printf("%02X-", data);
                        else
                                printf("%02X ", data);
                }
                buff[i1] = '\0';
                printf("  %s\n", buff);
        }
}
Study Cにロードする Study Cにロードし編集する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて... 「run file」のように実行する必要があるので実行ボタンはありません
最初にファイル名を表示する部分と、表示の真ん中で' 'を'-'表示にする部分を変更しました。 これでダンプコマンドは完成です。