Portieren von Linux nach Windows ( gcc / LccWin32 )



  • Woran könnte es liegen, dass die folgende Funktion unter Linux problemlos läuft ( Datei binär öffnen, jedes Byte lesen, erhöhen und an der selben Stelle wieder schreiben, bis EOF , schliessen ) unter Windows sich aber die Datei beständig vergrößert bis man abbricht?

    void incdat(void)
    {
      FILE *p;
      unsigned char b;
      p=fopen(datname,"r+b");
      if (p==NULL) { printf("fehler bei fopen"); return; }
      fread(&b,1,sizeof(char),p);
      while (!feof(p))
       {
          fseek(p,(sizeof(char)*(-1)),1);
          b++;  
          fwrite(&b,1,sizeof(char),p);
          fread(&b,1,sizeof(char),p);
       }
       fclose(p);
    }
    

    Sorry, falls dies der falsche Forenbereich für diese Frage sein sollte, ich war mir nicht ganz sicher.



  • unsigned char b;
    vs
    fread(&b,1,sizeof(char),p);

    Sieht nicht gut aus..



  • nobb schrieb:

    fseek(p,(sizeof(char)*(-1)),1);
    

    das sieht schlimmer aus. 😉
    der letzte parameter sollte sein SEEK_CUR, SEEK_END oder SEEK_SET.



  • und sizeof(char) ist immer 1 und die einzel größe ist der zweite Parameter von fwrite/fread und der dritte gibt die Anzahl an. Läuft auf das selbe hinaus, ist aber von der Konvention so.

    Um jede mathematische Operation und Konstante eine Klammer machen ist auch nicht gerade leserlicher 🙂

    Außerdem solltest du mal Variablennamen nehmen, die etwas über die Variable aussagen.

    Fehler solltest du außerdem auf stderr und nicht auf stdout schreiben!



  • Vielen Dank für alle Antworten. Ich habe sie direkt folgendermaßen beherzigt:

    void incdat(void)
    {
      FILE *filep;
      unsigned char byte;
      filep=fopen(datname,"r+b");
      if (filep==NULL)
       { fprintf(stderr,"Fehler bei fopen"); return; }
      fread(&byte,1,1,filep);
      while (!feof(filep))
       {
          fseek(filep,-1,SEEK_CUR);
          byte++;
          fwrite(&byte,1,1,filep);
          fread(&byte,1,1,filep);
       }
       fclose(filep);
    }
    

    Jetzt sieht's schon viel besser aus... funktioniert nur weiterhin unter Windows nicht.

    Daher habe ich noch eine Frage: Ist das Öffnen zum Lesen UND Schreiben auf einmal, wie ich es hier versuche eine Sache die man grundsätzlich ( oder zumindest bei Windows-Compilern ) vermeiden sollte?



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,

    zuerst mal wuerde ich bei den f... funktionen _immer_ den Ruckgabewert checken:

    void incdat(void) {
    	FILE *filep;
    	unsigned char byte;
    	filep = fopen("test.dat", "r+b");
    
    	if (filep == NULL) {
    		fprintf(stderr, "Fehler bei fopen: %s\n", strerror(errno));
    		return;
    	}
    
    	if (fread(&byte, 1, 1, filep) != 1) {
    		fprintf(stderr, "Fehler bei fread (1): %s\n", strerror(errno));
    	}
    
    	while (!feof(filep)) {
    		printf("Position: %d\n", ftell(filep));
    		if (fseek(filep, -1, SEEK_CUR) == -1) {
    			fprintf(stderr, "Fehler bei fseek: %s\n", strerror(errno));
    		}
    		byte++;
    		if (fwrite(&byte, 1, 1, filep) != 1) {
    			fprintf(stderr, "Fehler bei fwrite: %s\n", strerror(errno));
    		}
    		if (fread(&byte, 1, 1, filep) != 1) {
    			fprintf(stderr, "Fehler bei fread (2): %s\n", strerror(errno));
    		}
    	}
    
    	if (fclose(filep) == EOF) {
    		fprintf(stderr, "Fehler bei fclose: %s\n", strerror(errno));
    	}
    }
    

    Mit einer testdatei mit "lablala" bekomme ich folgenden output:

    Position: 1
    Position: 2
    Position: 3
    Position: 4
    Position: 5
    Position: 6
    Position: 7
    Fehler bei fread (2): Success
    

    Wenn du beim letztem byte bisst so liest du est, inkrementierst, eine position zuruck, schreiben (jetzt ist eof reached), liest nachstes byte (bei eof), erst dann wird die schleife abgebrochen.



  • ubu_roi schrieb:

    Hallo,

    zuerst mal wuerde ich bei den f... funktionen _immer_ den Ruckgabewert checken:

    Was nicht IMMER ratsam ist bzw. benutzerfreundlich ist, wenn man den Fehler einfach ausgibt.

    Sieht man wunderbar an deiner Ausgabe. Der "Fehler" am Schluss bedeutet nur, dass das Dateiende erreicht wurde.
    Außerdem sollte man überlegen, ob es Sinn macht überhaupt fortzufahren, wenn an bestimmten Stellen Fehler auftreten.

    @nobb
    Also eigentlich dürfte es auch kein Problem unter Windows sein. Hast du möglicherweise den Modus beim Öffnen der Datei auf "a+b" geändert? Das wär für mich jetzt die einzige Erklärung, dass die Datei immer größer wird.



  • AJ schrieb:

    Der "Fehler" am Schluss bedeutet nur, dass das Dateiende erreicht wurde.

    Bei mir wird das Ende leider nicht erreicht. Die Positionen steigen, solange ich das Programm nicht von Hand abbreche, immer weiter.

    Lasse ich die Funktion z.B. mit einer Datei laufen die "1234567" enthält, wird daraus unter Linux "2345678", unter Windows aber eine "2" und tausende von "3"en.

    Der Zugriffsmodus ist wie gehabt "r+b", nicht geändert.

    @ubu_roi Danke für die Fehlerbehandlung 🙂


Anmelden zum Antworten