K
/*** FileDump.c ********************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Konstanten
enum { ARG_PROG = 0, ARG_MODE, ARG_FILE, MAX_COLUMN = 16 };
enum { MODE_HEX = 0, MODE_OCT, MODE_DEC };
struct MODE
{
int base; //Basis des Zahlensystems
int digits; //Anzahl auszugebender Stellen
const char* option; //Optionsstring als Programmargument
const char* name; //Name des Modus
} MODI[] = { { 16, 2, "-h", "Hexadecimal" }, { 8, 3, "-o", "Octal" }, { 10, 3, "-d", "Decimal" } };
const char* USAGE = "Usage:\nFileDump [-{h|o|d}] file\nHexadecimal, octal or decimal dump of file";
//Ausgabe eines Bytes als Zahl-String
void OutputByte(int byte, int base, int digits)
{
static int col = 0;
char number[6], *start = number + strlen(strcpy(number, "000"));
printf("%s%s", (col ? " " : "\n"), start + strlen(itoa(byte, start, base)) - digits);
col = (col + 1) % MAX_COLUMN;
}
int main(int argc, char* argv[])
{
FILE* file;
int mode = -1, byte, test;
//Modus finden
for(test = MODE_HEX; test <= MODE_DEC; test++)
if(!strcmp(argv[ARG_MODE], MODI[test].option))
mode = test;
if((mode < 0) || (argc < 2) || (argc > 3))
return puts(USAGE), 1;
//Datei oeffnen
file = fopen(argv[ARG_FILE], "rb" );
if(!file)
return printf("File not found: %s\n\n%s\n", argv[ARG_FILE], USAGE), 1;
printf("%s file dump of %s:\n", MODI[mode].name, argv[ARG_FILE]);
//Alle Bytes der Datei nacheinander ausgeben
while((byte = fgetc(file)) != EOF)
OutputByte(byte, MODI[mode].base, MODI[mode].digits);
//Abschliessen
fclose(file);
printf("\n\nReady.\n");
return 0;
}