tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1123
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von shutdown
    shutdown shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.026
    Hallo!

    Ich hätt da mal wieder gern a Problem

    Und zwar versuche ich zur Zeit, in C++ den Hexa-Dezimal-Dump einer Datei zu erzeugen.
    Das funktioniert auf der Konsolenansicht auch wunderbar (Beispiel folgt).

    Nur wenn es nun darum geht, die selbe Ausgabe auch in eine Datei zu bekommen, dann weiß ich nicht mehr so recht, wie ich das machen soll.

    Hier mal der gesamte Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    #include <iostream.h>
    #include <fstream.h>
     
    void main(void)
    {
        ifstream dump;
        ofstream dump_out;
     
        char dump_pfad[100];
        char ausgabe_pfad[100];
     
        cout << "Hex-Dump einer Datei\n";
        cout << "--------------------\n\n";
     
        cout << "Pfad der Datei angeben: ";
        cin >> dump_pfad;
     
        cout << "Pfad der Ausgabe-Datei angeben: ";
        cin >> ausgabe_pfad;
     
     
        dump.open(dump_pfad, ios::nocreate);
     
        if(!dump)
            cout << "\nDatei nicht gefunden oder fehlende Zugriffsrechte";
        else
        {
            char nxt_ch;    //nächster Charakter
            int  nr_ch=0;     //Zahl des Charakter
     
            cout << hex;    //Hexa-Ausgabe
     
            int speicher;
     
            dump_out.open(ausgabe_pfad);
     
            while(dump.get(nxt_ch))
            {
     
     
                if(nr_ch % 16 == 0)
                {
                    cout << "\n";
                        cout.width(6);
                    cout << hex << nr_ch << " ";
                }
     
                cout.width(3);
     
                    cout << int(nxt_ch);
     
                speicher = int(nxt_ch);
                dump_out.put(speicher);
     
                nr_ch++;
            }
        }
     
        dump.close();
        dump_out.close();
    }

    Eine Datei mit Inhalt "123abc" erzeugt damit folgende Hexa-Anzeige:

    Code :
    1
    
    0  31 32 33 61 62 63

    0 ist die Zahl des ersten Elements einer Zeile (vergleichbar mit Speicheradressierung)


    Und hier kommt nun der Abschnitt des Codes, der mir Probleme macht:

    Code :
    1
    2
    
    speicher = int(nxt_ch);
    dump_out.put(speicher);

    Mache ich aus Speicher eine char-Variable, dann kopiert er mir die Datei 1 zu 1
    Ist Speicher aber eine int-Variable, dann krieg ich die Fehlermeldung:

    Code :
    1
    
    "Ambiguity between 'ostream::put(char)' and 'ostream::put(signed char)'   "
    Weiß hier jemand Rat?

    Vielen Dank schon mal im Voraus!

    shutdown
     
    Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Da du die Ausgabe in die Datei ja nicht binär, sondern als normalen Text machen möchtest, kannst du einfach den <<-Operator verwenden (genauso wie bei cout). Beispiel, ohne Gewähr:

    Code :
    1
    
    dump_out <<  hex << nirgendein_wert << " ";
    In deinem Code hast du das mit cout ja schon gemacht -- für die Datei funktioniert es genauso.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    Avatar von shutdown
    shutdown shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.026
    Danke für die Antwort!

    Nur leider funktionierts nicht so einfach.

    Er bringt zwar keine Fehlermeldungen wenn ich mit << in die Outputstream schreibe, er erstellt die Datei aber auch nicht.

    Damit ich weiterhin 2 Probleme:

    1) Mit dump_out << "\n"; wird keine Datei erstellt.
    2) Ich habe jetzt meinen Code etwas erweitert, so dass die Darstellung schon einem gewöhnlichen Hex-Editor recht nahe kommt. Ich hab jetzt einfach mal alle \n durch ein Zeichen ^ ersetzten lassen, um mir Zeilenumbrüche in der Ausgabe zu ersparen. Das funktioniert bei Textdateien auch sehr gut. Wenn ich dann aber andere Formate einlesen will, z.B. .bak, .c, .doc dann scheint es doch noch ein paar mehr Zeichen zu geben, die einen Zeilenumbruch verursachen. Wie schalt ich das ab?

    Ihr könnt es ja mal ausprobieren. Hier mein abgewandelter Code inkl. dem dump_out <<

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    
    #include <iostream.h>
    #include <fstream.h>
    #include <string.h>
     
    void main(void)
    {
        ifstream dump;
        ofstream dump_out;
     
        char dump_pfad[100];
        char ausgabe_pfad[100];
     
        cout << "Hex-Dump einer Datei\n";
        cout << "--------------------\n\n";
     
        cout << "Pfad der Datei angeben: ";
        cin >> dump_pfad;
     
        cout << "Pfad der Ausgabe-Datei angeben: ";
        cin >> ausgabe_pfad;
     
     
        dump.open(dump_pfad, ios::nocreate);
     
        if(!dump)
            cout << "\nDatei nicht gefunden oder fehlende Zugriffsrechte";
        else
        {
            char nxt_ch;    //nächster Charakter
            int  nr_ch=0;     //Zahl des Charakter
     
            cout << hex;    //Hexa-Ausgabe
     
            char ch_arr[20];
     
            for(int i=0; i<=20; i++)
                ch_arr[i] = '\0';
     
            char speicher[2];
     
     
           // int speicher;
     
            dump_out.open(ausgabe_pfad);
     
            while(dump.get(nxt_ch))
            {
     
                if(nr_ch == 0)
                {
                    cout.width(6);
                    cout.fill('0');
                    cout << hex << nr_ch << " ";
     
                    dump_out << hex << nr_ch << " ";
                }
     
                if((nr_ch % 16 == 0) && !(nr_ch == 0))
                {
                    cout << "\n";
                        cout.width(6);
                    cout.fill('0');
                    cout << hex << nr_ch << " ";
     
                    dump_out << "\n" << hex << nr_ch << " ";
                }
     
                cout.width(3);
                cout.fill(' ');
     
                    cout << hex << int(nxt_ch);
     
                dump_out << hex << int(nxt_ch);
                
                speicher[0] = nxt_ch;
                speicher[1] = '\0';
     
                if(speicher[0] == '\n')
                        strcpy(speicher, "^");
     
                strcat(ch_arr, speicher);
     
     
                if(ch_arr[15] != '\0')
                {
                    cout << " |" << ch_arr << "|";
     
                    dump_out << " |" << ch_arr << "|";
     
                    for(int i=0; i<=20; i++)
                        ch_arr[i] = '\0';
                }
     
     
             //   speicher = int(nxt_ch);
             //   dump_out.put(speicher);
     
                nr_ch++;
            }
     
            if(nr_ch % 16 != 0)
            {
                 int wert = 16 - (nr_ch % 16);
     
                 for(wert; wert > 0; wert--)
                 {
                     cout.width(3);
                     cout.fill(' ');
                     cout << "00";
     
                     dump_out << "00";
                 }
     
                 cout << " |" << ch_arr << "|";
     
                 dump_out << " |" << ch_arr << "|";
     
                 ch_arr[0] = '\0';
     
            }
     
     
        }
     
        dump.close();
        dump_out.close();
    }

    cu shutdown
     
    Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!

Ähnliche Themen

  1. Bestimmten Text aus Datei auslesen und in eine andere Schreiben
    Von wissensdurstxxl im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 08.08.07, 10:03
  2. Werte von einer Javascript Datei an eine andere. Geht das?
    Von BeachBoy im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 12.01.06, 16:55
  3. Aus Datei lesen und in eine andere Datei schreiben
    Von Computerpinguin im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 03.05.05, 14:29
  4. Antworten: 5
    Letzter Beitrag: 22.11.04, 17:16
  5. Antworten: 2
    Letzter Beitrag: 13.01.04, 08:40