Binärdatei schreiben und lesen



  • Was jedenfalls in's Auge springt ist, dass Du d.c_str() wegschreibst und in &b liest. Was macht denn Zeile 34 eigentlich?



  • Furble Wurble schrieb:

    Was jedenfalls in's Auge springt ist, dass Du d.c_str() wegschreibst und in &b liest. Was macht denn Zeile 34 eigentlich?

    Ja Zeile 34 war so n test. Hätt ich vielleicht noch wegmachen sollen. Und &b wollte ich absichtlich lesen.
    Naja ich hab es jetzt anders gemacht. Das auslesen sieht bei mir nun so aus:

    ifstream lesen;
        lesen.open("/cygdrive/c/bla.txt", ios::in|ios::binary);
    
        if(!lesen){
            cerr << "Datei existiert nicht";
            exit(-3);
        }
    
        lesen.read((char*)&size2,sizeof(int)); // größe wird zuerst ausgelesen damit sie bekannt ist
        char wort[size2];
        lesen.read(wort, size2);
        for(int i = 0; i< size2; i++){
            b += wort[i];
        }
    

    Und endlich funktioniert es!

    Den Code zum einlesen hab ich gelassen. MIch wundert nur eins: Die Daten die "Binär" auf die Datei geschrieben sind, sind trotzdem lesbar. Müssten da nicht irgendwelche kryptischen zeichen stehen oder ist das normal?



  • Hmm, da war ich wohl etwas sparsam...

    Du kannst direkt in den String lesen. Nur musst Du Deine Daten halt dahin schreiben, wo der String seine Daten hält. Und dieser Puffer muss auch groß genug sein:

    lesen.read((char*)&size , sizeof(int));
        b.resize(size);  // Platz schaffen
        lesen.read(&b[0], size);  // Du siehst den Unterschied zu Deinem Code.
    


  • Das mit den Binärdaten ist normal. ios::binary bedeutet einfach, dass Zeilenumbrüche nicht konvertiert werden sollen. Der eigentliche Unterschied zwischen binär und formatiert liegt in der Ausgabemethode. ofstream::write schreibt die Daten so wie sie sind raus, im Falle von strings ASCII/UTF8, je nach Zeichensatz oder bei int s eben die 4/8 Bytes. Der << -Operator schreibt string auch als ASCII/UTF8 raus, int s allerdings auch in lesbarer Form als string .


Anmelden zum Antworten