C言語専門のQ&Aサイト SUKEGRA

悩めるプログラマーを「ッターン!」と助太刀!

ファイルと変換


投稿者:匿名 投稿日時: 2016年6月5日
カテゴリー:
構文・記述方法について
タグ:なし

指定したファイルの内容を、nバイトずつ、n進数で表示し機能としてnの値を変換できるプログラムを記述してください。


0 支持

ログインまたはユーザー登録してから回答してください。

回答 1

投稿者:うんち (140 ポイント) 投稿日時: 2018年3月9日

nという変数が万能すぎて意味がわからなくなっていますが、要は

「読み込む単位バイト数と基数を引数に取り、ファイルの内容を表示するプログラムを作りなさい」

という設問でしょうか。
であればこんな感じになると思います。

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

void dumpfile(int byte, int base, char* filename);

int main(int argc, char* argv[])
{
    if(argc != 4){
        puts("引数の数が不正です。");
        return -1;
    }
    dumpfile(atoi(argv[1])<0?-atoi(argv[1]):atoi(argv[1]), 
            atoi(argv[2])<0?-atoi(argv[2]):atoi(argv[2]), argv[3]);
    return 0;
}
void printout(char* data, int base)
{
    int i = 0;
    int maxlen = 0;
    char* str = NULL;
    const char* table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    unsigned long long num = strtoull(data, NULL, 10);
    if(num == 0xffffffffffffffff){
        puts("読み込みバイト数が大きすぎます。");
        return ;
    }
    while(num /= 2){
        maxlen ++;
    }
    if((str = (char*)malloc(maxlen)) == NULL){
        puts("メモリ確保に失敗。");
        return ;
    }
    num = strtoull(data, NULL, 10);
    while(num > 0){
        str[i] = table[num % base];
        num /= base;
        i++;
    }
    if(i > 0){
        i--;
    } else {
        str[0] = table[0];
    }
    puts("変換結果:");
    for(int j=i; j>=0; j--){
        printf("%c", str[j]);
    }
    printf("\n\n");
    *data = '\0';
    free(str);
    return ;
}
void dumpfile(int byte, int base, char* filename)
{
    FILE* fp = NULL;
    char* data = (char*)malloc(byte);
    if(base < 2 || base > 62){
        puts("指定可能な基数は2~62です。");
        if(data){
           free(data);
        }
        return ;
    }
    if(!data || !(fp = fopen(filename, "r"))){
        if(data){
           free(data);
        }
        return ;
    }
    while(!feof(fp) && fread(data, byte, 1, fp)){
        printout(data, base);
    }
    if(*data){
        printout(data, base);
    }
    free(data);
    fclose(fp);
    return ;
}

使い方は

dumpfile.exe 15 10 "data.txt"

とするとdata.txtから15バイトずつ読み込み、10進数で表示します。
一応unsigned long longで定義することでなるべく多くのバイト数を読み込めるようにしていますが、
0xffffffffffffffff-0x1つまり18446744073709551615-1を越える数値は処理出来ません。
解り易く言えば最長20バイト長ですが、9で埋めるなら19長バイトまでですね。

dumpfile.exe 19 2 "data.txt"

とすると一番長い2進数表示を見られると思います。

...