Text und Binärdatei unterscheiden



  • Hallo,

    erstmal muß ich sagen,bin ein Programmierneuling.
    Bin gerade dabei Hobbymäßig C++ zu erlernen.
    Habe mir das untere Programm geschrieben um die
    beispiel sourcecodes meines C++ Buches mit Zeilennr.
    in der Konsole anzuzeigen.
    Klappt soweit schon gut.Wollte jetzt nur eine Fehler-
    abfrage einbauen wenn dem Programm eine Binärdatei
    übergeben wird.
    Wie kann ich den erkennen ob es eine Binärdatei ist?
    beim schreiben kann man ja base_ios::bin angeben.
    Aber wie ist es denn beim auslesen aus einer Datei?

    Danke

    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
      if (argc < 2) //wenn kein Argument angeben wurde
       {
        cerr << "Bitte einen Dateinamen als"
             << " Argument angeben!" << endl;
        return 0;
       }
    
      ifstream in(argv[1]); //argv[0] ist der Programmname,argv[1] das erste Argument beim Programmaufruf
      if (!in) //Fehlerabfrage
       {
        cerr << "Datei " << argv[1] << " kann " << "nicht geöffnet werden!" << endl;
        return 0;
       }
    
      string buffer;
      unsigned long l=1;
    
    	while(!in.eof()) //solange das Dateiende nicht erreicht ist
       {
        getline(in, buffer); //ganze zeile einlesen und in buffer speichern
        cout << l << ": " << buffer << endl;
        l++;
       }
    
      return 0;
    }
    


  • Das musst du "wissen". Das heisst, es muss dir bekannt sein, wie, was, wo gespeichert wird. Dazu gibt es Dokumentationen, oder bei was selbstgeschriebenen dein Hirn. 😉
    Du musst ja sowieso wissen, was alles in der Datei ist. Du willst ja schliesslich irgendwas mit den Daten anfangen. Lediglich einlesen macht ja keinen Sinn du willst es ja auch noch brauchen, also musst du wissen, was, wie wo drinn ist.



  • danke erstmal für Deine Antwort.
    In dem Fall hier lade ich ja schon vorhandene Dateien ein.
    Wenn ich nun versehentlich eine binäre Datei lade,wird Müll
    angezeigt...klar.Nur wenn ich dann in der Shell weiter
    arbeiten will werden weiterhin nur kryptische Zeichen angezeigt.
    Hilft nur die Shell zu beenden und neu zu starten.
    Sollte doch eine Möglichkeit geben auf binär oder ASCII Datei
    zu prüfen...

    gruß
    volc



  • Also einen direkten weg gibt es nicht.
    Du hast könntest allerdings eine "statistische untersuchung" des Dateininhaltes machen.

    Ein beispiel: Eine Textdatei sollte doch eigentlich nur aus druckbaren Zeichen bestehen.
    Du könntest dir jedes byte der Datein mit isprint() ansehen, und jedes byte das nicht druckbar ist Zählen. Dann sagst du z.B., dass wenn mehr als 5 % der Datei nicht druckbar sind, dass es eine Binärdatei ist.

    Wenn die ganze Datei zu groß ist, kannst du auch nur den Anfang, oder die Mitte oder das Ende nehmen, das ergebnis sollte nicht viel Abweichen.

    Falls dir isprint() zu langsam ist (was komisch wäre...), kannst du die Tatsache ausnutzen, dass ASCII zeichen nur 7 bits von einem byte verwenden. Das achte ist auf null gesetzt.

    Dann könntest du z.B. einfach überrüfen, ob das höchste bit gesetzt ist:

    if ( ! (iput_byte & 0x80) ) 
        unprintable_count++;
    

    Hoffe, das hilft dir ein wenig.

    mfg, DrPhil_Guth



  • Warum sollte er Bit 7 prüfen? Könnte für Umlaute doch schwierig werden. Sollte er nicht in die ersten 31 Zeichen außer '\t','\n' usw suchen?


Log in to reply