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進数表示を見られると思います。