Lesen von Binär Dateien



  • hallo,
    meine Funktionen read() und write() sehen jetzt so aus:

    void Write()
    {
        cls();
        string name;
        string name1;
    
        setCursor(10,1);
        cout << "Bitte geben Sie den Pfad an, wo die Datei gespeichert\nwerden soll (z.B. c:\\Hallo.bin): ";
    
        cin >> name;
        ofstream FileIn(name.c_str(),ios::out|ios::binary);
        if( !FileIn)
         {
             openError();
         }
    
        cls();
    
        cout << "Bitte geben sie nun den Text ein der der Datei hinzugefuegt\nwerden soll: ";
    
        cin >> name1;
        int size = name1.length();
    
        FileIn.write( (char*)size, sizeof(size));
        if( !FileIn.write( name1.c_str(), name1.length()))
        {
            writeError();
        }
    
        cls();
        FileIn.close();
    
        cout << "Vielen Dank!\n Die Datei ist nun unter '" << name << "' gespeichert!\n Auf Wiedersehen!";
    }
    
    void Read()
    {
         cls();
         string name;
    
         setCursor(10,1);
         cout << "Bitte geben sie den Pfad zu der Datei an die sie lesen moechten: ";
    
         cin >> name;
         cls();
         ifstream FileOut(name.c_str(),ios::in|ios::binary);
         if( !FileOut)
         {
             openError();
         }
    
         else
         {
            int size; 
    
            FileOut.read( (char*)size, sizeof(size)); 
            char* buffer = new char[size+1]; 
            FileOut.read( buffer, size); 
            buffer[size] = '\0'; 
            name = buffer; 
            delete[] buffer;
         }
    

    Aber beim schreiben wird das Programm einfach nachdem ich angegeben habe was in die Datei geschrieben werden soll angegeben habe beendet, wieder mit dieser "Fehler in Der Anwendung" fehlermeldung -> Die Anweisung "0x00435dd9" ... blabla.
    ??



  • Geh doch mal mit dem Debugger durch und schau wo abgebrochen wird. Desweiteren wirst du beim einlesen mit cin Schwierigkeiten bei Trennzeichen (Leerzeichen oder so) bekommen, da dann hier abgebrochen wird. Nimm lieber getline.



  • getline(cin, name1);
    

    richtig?

    ok habs durch den debugger laufen lassen aber er zeigt keine fehlermeldungen an...



  • Das mit dem getline ist richtig.
    Wenn dein Programm abbricht, muß es doch auch im Debugger abbrechen. Es ist halt wichtig herauszubekommen wo der Fehler auftritt. Ich sehe in deinem Code erstmal keine Fehler.



  • FileOut.write((char*)size,sizeof(size));
    

    Da ist ein kleiner, aber dezenter Fehler drin - du interpretierst den Wert von "size" als Adresse der Daten, die du schreiben willst - da ist ein SegFault sehr wahrscheinlich. (und selbst wenn du diese Adresse lesen kannst, steht bestimmt nicht das richtige drin ;))

    Richtig müsste es heißen:

    FileOut.write(&size,sizeof(size));
    

    (PS: Bei der Read()-Funktion hast du den selben Fehler)



  • Ok, war auch mein Fehler. Korrekt müsste es wohl so heißen

    FileOut.write((char*)&size,sizeof(size));
    

    Der cast ist schon notwendig.
    oder noch besser

    FileOut.write(reinterpret_cast<const char*>(&size),sizeof(size));
    

    [edit]const noch eingefügt[/edit]



  • OK! Danke!
    Jetzt bricht er nicht mehr ab, aber jetzt habe ich wieder ein neues problem^^(sieht so aus als könnte das nie enden... 😉 ) Das Programm überspringt einfach den Teil wo etwas in die Datei geschrieben werden soll. 😮

    EDIT: Kann man eigentlich den text formatieren so das er z.B. rechtsbündig geschrieben wird oder das mal nach einer bestimmten Anzahl von Zeichen ein newline gemacht wird??



  • Weiß keiner was?(sry für doppelpost)



  • Bei dem Code hilft nur noch die Entfickler-Taste. Zuerst Strg + A und dann entfrickeln mit Entf.



  • Nochmal. Geh mit dem Debugger durch und schau was passiert.
    Bezüglich rechtsbündig. Wohin willst du denn rechtsbündig ausgeben, in eine Datei? Das geht nicht.


Anmelden zum Antworten