Datei binär einlesen



  • das binäre Lesen einer Datei geht wesentlich einfacher, wenn man die istream- bzw. istreambuf-iteratoren nutzt. Außerdem vereinfacht die Verwendung von Containern den Code. Etwa so:

    #include <fstream>
    #include <iostream>
    #include <vector>
    #include <iterator> // istreambuf_iterator<>
    
    int main()
    {
        using namespace std;
        vector< char > daten;
        string path = "test.dat"; 
        ifstream file( path.c_str(), ios_base::binary );
        daten.assign( istreambuf_iterator< char >( file ), istreambuf_iterator< char >() ); // lies 'alles' ein
    
        cout << daten.size() << " Bytes gelesen" << endl;
        if( daten.size() > 0 )
            cout << "Der Wert von daten[0] ist " << int(daten[0]) << endl;
    
        return 0;
    }
    

    binary2 schrieb:

    Am Ende möchte ich, das folgender Code möglich ist:

    if (daten[0][0] == 00)
      cout << "Test" << endl;
    

    .. ja - wo ist das Problem?

    binary2 schrieb:

    Und ich habe noch eine Frage, gibt es irgendwo eine gute Dokumentation zu fstream? Die MSDN Doku ist in dieser Sache nämlcih sehr kompliziert und nur schwer zu durchschauen.

    siehe cpp-Reference.
    Bedenke bitte, dass std::ifstream von std::istream abgeleitet ist. Die meisten Dinge, nach denen Du fragst, wirst Du also unter der Doku von std::istream finden.

    binary2 schrieb:

    PS: Vor*raus wird zensiert 😮

    .. das liegt wohl daran, dass die hiesigen Moderatoren es leid sind, sich solche Rechtschreibfehler anzuschauen -siehe vorraus. 😉

    Gruß
    Werner



  • Werner Salomon schrieb:

    das binäre Lesen einer Datei geht wesentlich einfacher, wenn man die istream- bzw. istreambuf-iteratoren nutzt. Außerdem vereinfacht die Verwendung von Containern den Code. Etwa so:

    #include <fstream>
    #include <iostream>
    #include <vector>
    #include <iterator> // istreambuf_iterator<>
    
    int main()
    {
        using namespace std;
        vector< char > daten;
        string path = "test.dat"; 
        ifstream file( path.c_str(), ios_base::binary );
        daten.assign( istreambuf_iterator< char >( file ), istreambuf_iterator< char >() ); // lies 'alles' ein
    
        cout << daten.size() << " Bytes gelesen" << endl;
        if( daten.size() > 0 )
            cout << "Der Wert von daten[0] ist " << int(daten[0]) << endl;
    
        return 0;
    }
    

    Ich habe eine feste Anzahl an Zeilen und Spalten und so finde ich meinen Code auch übersichtlich und einfach 🙂

    Werner Salomon schrieb:

    binary2 schrieb:

    Am Ende möchte ich, das folgender Code möglich ist:

    if (daten[0][0] == 00)
      cout << "Test" << endl;
    

    .. ja - wo ist das Problem?

    War natürlich wieder ein simpler Fehler. Ich hab statt 105 z.B. 69 geschrieben, wobei 69 natürlich hexadezimal und nicht dezimal ist.

    Werner Salomon schrieb:

    binary2 schrieb:

    Und ich habe noch eine Frage, gibt es irgendwo eine gute Dokumentation zu fstream? Die MSDN Doku ist in dieser Sache nämlcih sehr kompliziert und nur schwer zu durchschauen.

    siehe cpp-Reference.
    Bedenke bitte, dass std::ifstream von std::istream abgeleitet ist. Die meisten Dinge, nach denen Du fragst, wirst Du also unter der Doku von std::istream finden.

    Danke, unter istream finde ich direkt alles was ich will/wollte 🙂

    Werner Salomon schrieb:

    binary2 schrieb:

    PS: Vor*raus wird zensiert 😮

    .. das liegt wohl daran, dass die hiesigen Moderatoren es leid sind, sich solche Rechtschreibfehler anzuschauen -siehe vorraus. 😉

    🙄 Danke, wieder was dazugelernt! Deutsche Rechtschreibung ist aber schon mist. Manche Wörter brauchen 3 mal den gleichen Konsonant hintereinander und hier nur einmal 😡



  • binary2 schrieb:

    🙄 Danke, wieder was dazugelernt! Deutsche Rechtschreibung ist aber schon mist. Manche Wörter brauchen 3 mal den gleichen Konsonant hintereinander und hier nur einmal 😡

    Früher ging man halt aus, um was zu Unternehmen. Heute geht man dazu raus.
    Sehr schön ist auch, wenn man Wissen in den Kopf rin tut, das sind dan Errinnerungen.



  • volkard schrieb:

    binary2 schrieb:

    🙄 Danke, wieder was dazugelernt! Deutsche Rechtschreibung ist aber schon mist. Manche Wörter brauchen 3 mal den gleichen Konsonant hintereinander und hier nur einmal 😡

    Früher ging man halt aus, um was zu Unternehmen. Heute geht man dazu raus.
    Sehr schön ist auch, wenn man Wissen in den Kopf rin tut, das sind dan Errinnerungen.

    Aber sollte die neue Rechtschreibung nicht bezwecken, dass man alles so schreibt, wie man es spricht? Und ich habe noch nie jemanden gehört, der vor-aus sagte. Man hör nur vor-raus...
    Naja egal gehört ja hier nicht zum Thema.

    Allerdings habe ich noch ein Problem. Und zwar verursacht ein zweidimensionaler char Array seltsame Fehler. FAST alle Variablen werden irgendwie falsch deklariert.
    So wird aus einer 100 eine 16792655 oder eine -536870912 und die CStrings werden auch zu undefinierbaren Zeichenketten. Ein paar Variablen werden aber doch richtig deklariert.
    Laut google sollte ein zweidimensionales char Array aber gehen. Dabei macht es kein unterschied ob ich

    char daten[3][16];
    

    oder

    BYTE daten[3][16];
    

    schreibe.

    Wäre nett, wenn mir jemand sagen kann, wie ich es richtig hinbekomme.



  • Ein eindimensionales Array tuts auch nicht. Aber wenn ich das Array nicht global deklariere, sondern in irgendeiner Funktion funktioniert es.
    Kann man char Variablen etwa nicht global deklarieren?
    Soweit ich weiß, sollte es doch eigentlich funktionieren...



  • binary2 schrieb:

    So wird aus einer 100 eine 16792655 oder eine -536870912 und die CStrings werden auch zu undefinierbaren Zeichenketten. Ein paar Variablen werden aber doch richtig deklariert.

    Wie stellst du das denn fest? Strings sind in C übrigens nullterminiert, was deine nicht sind.



  • Ich habe den Array jetzt über einem POINT deklariert. Davor war er darunter deklariert, Semikolons waren aber alle da. Jetzt funktioniert es.
    Nur habe ich jetzt festgestellt, dass die Datei halb fehlerhaft ausgelsen wird.
    In der ersten Zeile, sind die Werte in der Datei, in der zweiten Zeile stehen die Werte, welche ausgelesen wurden:

    00  01  02  03  04  01  02  03  04  00  02  03  04  00  01
    96 -64 -58  03  01  00  00  00  04  00  02  03  04  00  01
    

    Die erste Hälfte wird also falsch ausgelsen, und die zweite richtig. Allerdings kann ich mir das gerade nicht wirklich erklären. Kann mir das wer weiterhelfen?


  • Mod

    binary2 schrieb:

    Ich habe den Array jetzt über einem POINT deklariert. Davor war er darunter deklariert, Semikolons waren aber alle da. Jetzt funktioniert es.
    Nur habe ich jetzt festgestellt, dass die Datei halb fehlerhaft ausgelsen wird.
    In der ersten Zeile, sind die Werte in der Datei, in der zweiten Zeile stehen die Werte, welche ausgelesen wurden:

    00  01  02  03  04  01  02  03  04  00  02  03  04  00  01
    96 -64 -58  03  01  00  00  00  04  00  02  03  04  00  01
    

    Die erste Hälfte wird also falsch ausgelsen, und die zweite richtig. Allerdings kann ich mir das gerade nicht wirklich erklären. Kann mir das wer weiterhelfen?

    Welchen Code benutzt du denn dafür? Du hast schließlich schon viele gute Tipps bekommen, seitdem du das letzte Mal deinen Code gezeigt hast, die du hoffentlich alle gelesen, verstanden und umgesetzt hast 😃 .



  • Doch, an dem Code hat sich fast nichts geändert. Jetzt habe ich auch mal die andere Methode von Wernde Salomon ausprobiert, obwohl ich sie noch nicht ganz verstehe. Muss ich mir nochmal genauer angucken. Aber so werden die Daten natürlich richtig eingelesen. Allerdings erscheint mir das ganze etwas umständlich, da ich den vector dann noch in ein zweidimensionales Array umwandeln muss, und die größe sowieso fest ist.
    In einem anderem Projekt funktioniert meine Methode auch einwandfrei, nur in meinem großen "Ich lerne alles Projekt" funktioniert es nicht einwandfrei, obwohl ich das ganze völlig unabhänging von anderen Sachen mache.



  • Anscheinend funktionieren doch beide Methoden einwandrei. Das Array ist am Ende der Lsdefunktion korrekt. Erst wenn ich es in einer anderen Funktion aufrufe, hat es diese seltsamen Werte.
    Jetzt habe ich mal das Array als allererstes deklariert, direkt unter den #include Anweisungen, und jetzt funktioniert es...
    Keine Ahnung wieso, aber das Problem ist jetzt gelöst.


Anmelden zum Antworten