X-bytes überschreiben...



  • Hi Leute.

    Bin grad an nem kleinen Tool am schreiben, dass mir Daten aus ner Datei ausliest, die dann mit einigen Bit-shipt-funktionen verändert und dann in ne andere Datei an eine bestimmte Stelle schreiben soll...

    Bin jetzt auch schon soweit, dass meinem Prog zwei parameter übergeben werden müssen (parameter 1: die Datei, in die geschrieben werden soll, parameter2: das Offset, wo die daten hin sollen.), dass das Prog die Daten aus der ersten Datei einliest und umgeandelt in 16x2 chars abspeichert....

    Mein Problem ist jetzt allerdings, dass ich die bereits vorhandenen 32byte in der Datei überschreiben will. Bin mit meinem Filepointer schon an dem richtigen Offset, hab aber keine Ahnung wies jetzt weitergehn soll... weil es gibt ja nur die Möglichkeiten (soweit ich weiß), Dateien mit append zu verlängern oder irgendwo was hinzu zu fügen. Es ist hierbei aber wichtig, dass sich in der Datei ausser den 32 Byte nichts verändert. Die Datei darf danach nicht größer sein, als vor dem schreibvorgang...

    hat jemand ne Idee, wies geht? 😕



  • vielleicht hilfts etwas die datei im modus r+ zu öffnen.



  • Oh man! Wie einfach... kann mir jetzt noch jemand verraten, warum es in der DevC++-hilfe heisst "r+ Open a text file for read/write"?!

    Das hat für mich nicht bedeutet, dass da überschrieben wird... 🙄



  • FloBo schrieb:

    Oh man! Wie einfach... kann mir jetzt noch jemand verraten, warum es in der DevC++-hilfe heisst "r+ Open a text file for read/write"?!

    Das hat für mich nicht bedeutet, dass da überschrieben wird... 🙄

    Wenn du nur "w" verwendest, wird die Datei einfach gelöscht und du fängst von vorn an zu schreiben. Bei "a" kannst du nur ans Ende schreiben. Logischerweise brauchst du dann also einen Schreib- und Lesezugriff ;).



  • Ähhm. Ich weiß ja nich, ob ich mich zu blöd anstell, aber ich krieg das nicht so zum Laufen, wie ichs gern hätt.

    Nur zur Verdeutlichung:

    Ich habe eine Datei (genau 1 Megabyte groß). Ich will in dieser Datei, sagen wir mal an Offset x1B3D 32Bytes überschreiben (!!). Es ist dabei wichtig, dass die Bytes wirklich überschrieben werden und nicht einfach 32 neue an besagtes Offset eingefügt werden. Die Datei muss danach immernoch exakt ein Megabyte groß sein, da sie sich nicht mehr ausführen lässt, wenn sich die Größe ändert (intern abgespeicherte Pointer)...

    Ich habe jetzt alle Zugriffsarten ausprobiert.

    r Open a text file for reading nix
    w Create a text file for writing lädt nicht mehr
    a Append to a text file nix
    rb Open a binary file for reading lädt nicht mehr
    wb Open a binary file for writing lädt nicht mehr
    ab Append to a binary file nix
    r+ Open a text file for read/write nix
    w+ Create a text file for read/write lädt nicht mehr
    a+ Append or create a text file for read/write nix
    r+b Open a binary file for read/write nix
    w+b Create a binary file for read/write lädt nich mehr
    a+b Append a binary file for read/write nix

    Bei allen Access-möglichkeiten, wo nix dransteht, sieht man beim nachfolgenden ausführen der Datei keine Änderung (bei jedem Zugriff, wo kein Write verwendet wird oder wo append verwendet wird, ist mir das auch klar)....

    Bei den anderen Fällen, wo dran steht lädt nicht mehr, ist es so, dass die Ursprüngliche Datei gelöscht wurde und die modifizierte Datei grademal 32Byte groß ist...

    Ich hab jetzt echt keine Ahnung mehr, was ich da falsch gemacht haben könnte. Ich will doch nur ein paar Hexbyte überschreiben....:((

    Hier hab ich noch nen Ausschnitt aus meinem Quellcode, falls das was hilft...

    if ((ptr = fopen(argv[1], "a+b")) == NULL){
         printf("ERROR. Incorrect input parameters.\nThe rom you wanted to insert the palette into, couldn't be found.\n\n\n");
         printf("\n\nProgram will terminate now . . .\n");
         system("PAUSE");
         exit(1);
      }
      printf("Path to file found.\nLoading file");
    
      //Hier werden jetzt die entsprechenden Daten an dem entsprechenden Offset ausgelesen...
      pos = ftell(ptr);
    
      //Hier haben wir einige Variablen, die es uns ermöglichen, den zweiten Parameter
      //von Hex in Dezimal zu konvertieren.
      char x[1];
      char temp[21];
      char offset[20];
      strncpy(x, argv[2], 1);
      strncpy(temp, argv[2], 20);
    
      //Standardmäßig wird davon ausgegangen, dass das Offset im Dezimalformat vorgenommern wurde.
      //Deshalb wird das Integer pos als reine ToInt-konvertierung des 2. Parameters initialisiert.
      pos = atol(argv[2]);
    
      //hier wird gecheckt, ob das Offset als Hexwert eingegeben wurde.
      if (x[0] == 'x' || x[0] == 'h' || x[0] == '$') {
               int i;
               for (i = 1 ; i < 22 ; i++) {
                   //hier wird aus dem Kompletten Offsetstring nur der reine Hexstring.
                   //Bedeutet: Der erste Char wird einfach abgeschnitten.
                   offset[i-1] = temp[i];
                   }
               //Konvertierung von Hex in Dezimal
                pos = (int) strtol(offset, NULL, 16);
                printf("Offset-conversion done.\n");
               }
               //Ende der Konvertierungsgeschichte^^
    
      //Mit dem fseek-befehl wird an das Entsprechende Offset (was jetzt auf jeden Fall im Dezimalformat vorliegt) gesprungen.
    
      //Hier wird eine Funktion aufgerufen, die eine Konvertierung der Daten aus r[i], g[i] und b[i] vornimmt und daraus das array c1[i] und c2[i] füttert.
      i = 0;
      while (i != 16) {
            c2[i] = makesnes1(r[i], g[i], b[i], i, c1[i], c2[i]);
            c1[i] = makesnes2(r[i], g[i], b[i], i, c1[i], c2[i]);
            i++;
            }
    
      i=0;
      while (i != 16) {
            fwrite(&c2[i], 1, 1, ptr);
            fwrite(&c1[i], 1, 1, ptr);
            i++;
            }
    
            fclose(ptr);
    


  • Du schreibst zwar, dass du fseek() verwendest, es ist aber im Quellcode nicht zu finden.

    Der richtige Modus für fopen() müsste übrigens w+b sein.



  • Hey! Vielen Dank!

    Hatte wohl beim rumprobieren zufällig die Zeile gelöscht...

    Der schreibmodus zum Ersetzen war übrigens "r+b"... warum auch immer. Egal! Es funzt^^


Anmelden zum Antworten