Binär-Datei einlesen mit C/C++



  • Ich habe folgendes Problem beim einlesen einer Binärdatei:
    Wenn ich meine Routine mit einer Testdatei mit einfachem Text als Inhalt teste, funktioniert alles prima und er liest die Datei bis zum Ende fehlerfrei ein.
    Wenn ich nun die "richtige" Binärdatei einlesen will, so stoppt er mit dem einlesen schon nach ein paar Byte, da dort die ASCII-Zeichen 0x17 (=ETB, End of Transmission Block) und 0x1A (= SUB, Dateiendezeichen (EOF, End of File) für Textdateien) stehen. Die Binärdatei ist aber hier noch lange nicht zu Ende, sondern es stehen halt einfach diese HEX-Werte an dieser Stelle in der Datei. Ich habe es schon mit untenstehenden Standard-C-Funktionen zum Datei-einlesen probiert, aber er bricht immer ab.
    __________________
    ifstream in(dateiname);
    in>>filein[index];
    __________________
    fgets();
    fgetc();
    __________________

    Gibt es eine Möglichkeit damit die komplette Datei eingelesen wird. Die Größe der Datei habe ich ja. Ich brauch was in der Richtung:

    char String[]="";
    Pointer = OpenFile(dateiname);
    for(i=1;i<=DATEIGRÖSSE_IN_BYTE;i++)
    String[i] = Lese(Pointer, byteweise);

    Für Vorschläge und Lösung(-sansätze) wäre ich sehr dankbar.



  • Hallo,

    Schau doch mal in die FAQ
    Dateien und Ströme in C++



  • Binäre Daten einlesen kannst du mit read() (und das sogar in größeren Blöcken):

    ifstream file(dateiname,ios:in|ios::binary);
    char * data = new char[DATEIGROESSE];
    file.read(data,DATEIGROESSE);
    ...
    delete[]data;
    

    PS: dein char String[]=""; ist ziemlich sicher zu klein für den Inhalt einer kompletten Datei. Und in C++ beginnt der Array-Index mit 0.



  • #include <iostream>
    #include <fstream>
    
    bool output_file_content(const std::string& filename)
    {
        std::ifstream file_stream("test.bin", std::ios::in | std::ios::binary);
        if (file_stream.is_open() == false || file_stream.good() == false)
            return false;
    
        file_stream.seekg(0, std::ios::beg);
        std::fstream::pos_type length = file_stream.tellg();
        file_stream.seekg(0, std::ios::end);
        length = file_stream.tellg() - length;
        file_stream.seekg (0, std::ios::beg);
    
        char* content = new char[length];
        file_stream.read(content, length);
        file_stream.close();
        // mach was mit content ... 
        std::cout << content << std::endl;
        // nur am Ende:
        delete [] content;
        return true;
    }
    

    Edit
    Hmm ... zu spät ...


Anmelden zum Antworten