Inhalt einer Datei hexadezimal ausgeben



  • Aufgabe:
    Schreiben Sie ein Progamm, das den Inhalt einer Datei hexadezimal ausdruckt.
    Tipp: Da manche Compiler char als signed char implementieren, man aber für die Dar-
    stellung eine unsigned-Zahl braucht, muss ein Zeichen etwa wie folgt umgewandelt wer-
    den:

    char c; 			// evtl. signed
    while (datei.get(c)) { 		// lesen
    	unsigned char uc = static_cast<unsigned char>(c);
    	unsigned int zahl = static_cast<unsigned int>(uc);
    	// zahl hier weiterverarbeiten ...
    }
    

    Musterlösung:

    //  Datei hexadezimal ausgeben
    // Hilfsmittel: Zeichen mit String ermitteln
    #include <cstdlib>  // für exit()
    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
      cout << "Dateiname :";
      string Quelldateiname;
      cin >> Quelldateiname;
    
      ifstream quelle(Quelldateiname, ios::binary);
      if (!quelle) {  // muss existieren
        cerr << Quelldateiname << " kann nicht geöffnet werden!\n";
        exit(-1);
      }
    
      // char ist notwendig, weil get(unsigned char&) nicht
      // implementiert ist (GNU C++)
      char c;  // signed!
      unsigned int count = 0;
      while (quelle.get(c)) {
        unsigned char uc = static_cast<unsigned char>(c);
        unsigned int zahl = static_cast<unsigned int>(uc);
        const string codierung{"0123456789ABCDEF"};
        // 2 stellig ausgeben
        cout << codierung.at(zahl / 16) << codierung.at(zahl % 16) << ' ';
        if (++count % 20 == 0) {
          cout << '\n';
        }
      }
      cout << '\n';
    }
    

    Kann mir vielleicht jemand helfen das nachzuvollziehen?
    Ich führe das Programm aus und egal was ich für einen String eingebe, es kommt immer die Fehlermeldung cerr << ...
    Die Aufgabenstellung verstehe ich so, dass der Benutzer einen String eingeben soll (also Datei = String).
    Soweit müsste ich erstmal kommen um zu versuchen den Rest des Programms nachzuvollziehen.



  • @theAnfänger77 sagte in Inhalt einer Datei hexadezimal ausgeben:

    Ich führe das Programm aus und egal was ich für einen String eingebe,

    Du musst schon den Namen einer existierenden Datei eingeben und nicht irgendeinen String.



  • Ah danke!
    In Zeile 14 heißt das Zauberwort HSC Datei.



  • @theAnfänger77 Du kannst jede Datei nehmen. Auch das Programm selber.



  • @theAnfänger77 sagte in Inhalt einer Datei hexadezimal ausgeben:

    cout << codierung.at(zahl / 16) << codierung.at(zahl % 16) << ' ';
    

    std::hex ist Dein Freund.

    //edit: ach so, und
    std::setw() und
    std::setfill()



  • Das verstehe ich auch gar nicht:

    cout << codierung.at(zahl / 16) << codierung.at(zahl % 16) << ' ';
    

    Für zahl = 15 wird dann 0 ausgegeben und 15 ist doch F.

    Sowas dann eher noch:

    unsigned int uc = 15;
    std::cout << std::hex << uc << ' ';
    


  • @theAnfänger77 sagte in Inhalt einer Datei hexadezimal ausgeben:

    cout << codierung.at(zahl / 16) << codierung.at(zahl % 16) << ' ';

    Nö, für 15 wird daraus:

    cout << codierung.at(0) << codierung.at(15) << ' ';
    

    also: 0F



  • Ah stimmt!


Log in to reply