binärdateien verändern



  • ich bin neu was c++ angeht und ich möchte binärdateien verändern, aber immer wenn ich in eine binärdatei etwas hineinschreibe verschwindet alles andere.
    hier ein beispiel:
    ich habe eine Datei mit Inhalt "AAAAAAAA"
    nun führe ich folgenden code aus:
    char c='f';
    ofstream PartitionA(Dateiname_und_Pfad, ios::binary);
    PartitionA.seekp(512*spinBox1->value(),ios::beg); //spinBox1->value() im Beispiel = 0
    PartitionA.put(c);
    PartitionA.put(c);
    PartitionA.put(c);
    PartitionA.put(c);
    PartitionA.put(c);
    und dann steht in der Datei nur noch "fffff"
    und nicht wie ich es will "fffffAAA"
    ich habe schon versucht |ios::ate hinzuzufügen, damit das standartmäßige trunc nicht mehr aktiv ist aber das hat auch nichts geändert, kann mir jemand helfen?



  • Du kannst eine Datei nicht direkt auf der Platte ändern sondern musst sie in einen Buffer einlesen, sie dort verändern und zurückschreiben.

    Greetz, Swordfish



  • hm, das ist aber schlecht, ich will nämlich meine /dev/sda3 als binärdatei öffnen und verändern, und es ist ziehmlich blöd ne ganze Partition (auch wenn sie in meinem fall nur 1 GB hat) irgendwo zwischenzuspeichern...



  • Darf ich fragen, was genau du vorhast?

    Greetz, Swordfish



  • ich schreibe mein eigenes kleines OS in Assembler
    und habe die binärdateien bisher immer über PartitionMagic(Windows) oder ein selbst geschriebenes Qbasic-Programm(DOS) auf die passende Partition kopiert, da ich aber lieber nur noch mit linux arbeiten möchte brauche ich ein neues programm, das mir die einzelnen binärdateien auf die sektoren der betreffenden partition schreibt, welches ich gedenke in C++ zu schreiben.

    warum ist c++ denn so umständlich, es muß doch möglich sein einzelne bytes in einer Datei zu verändern, ohne gleich die ganze datei neu zu schreiben!?



  • Ah, ich habs annähernd hingekriegt mit:

    #include <stdio.h>
        FILE *PartitionA;
        PartitionA = fopen(lineEdit1->text(), "rb+");
        char c='f';
        fputc(c,PartitionA);    
        fclose(PartitionA);
    

    auf diese weise bleibt das alte erhalten, ich denke wenn ich mich da noch'n biserl mehr einarbeite krieg ich das schon hin, bin trotzdem für weitere tips dankbar...
    wäre nämlich zB wirklich schöner das so hinzukriegen das sich die Datei wie bei einem stream am ende des void alleine schließt, also ohne das man fclose() benutzen muß...



  • schau dir mal man dd an.

    Greetz, Swordfish



  • ah, ja danke, das ist auch ein nettes tool, aber wo ich jetzt schon dabei bin schreib ich mir nen schönes prog mit ner grafischen oberfläche.

    obwohl ich mir auch mit hilfe von dd nen shell-script erstellen werde, also danke 👍


Anmelden zum Antworten