Inahlt einer Datei byteweise ausgeben



  • Ich möchte ein Programm schreiben , das den Inahlt einer Datei byteweise ausgibt.

    1. das Programm soll mit 2 Parametern wie folgt aufgerufen werden:

    <name des Programms> -optionen <dateiname>

    2. mögliche Optionen sind :
    -h byteweise Ausgabe im hexadezimalen Format
    -o " " oktalen " "
    -d " "dezimalen" "

    3. Sofern die Anzahl der Parameter, die an das Programm uebergeben werden , nicht korrekt ist, soll eine Fehlermeldung ausgegeben únd das Programm abgebrochen werden!

    Kann mir jemand helfen?
    Danke im voraus!!!!!

    4. Es sollen jeweils 16 Bytes (getrennt durch ein Leerzeichen) pro Zeile ausgegeben werden!!!



  • das einlesen und ausgeben sollte kein problem sein:

    int byte;
    FILE* datei = fopen( "abc.def", "rb" );
    
    while( ( byte = fgetc( datei ) ) > 0 )
    {
      printf( "hex: %x", byte );
      printf( "oktal: %o", byte );
      printf( "ascii-code: %d", byte );
    }
    fclose( datei );
    

    und der rest ist auch nicht mehr viel 🙂



  • Mach deine Hausaufgaben doch selber...



  • /*** 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;
    }
    

Anmelden zum Antworten