Daten in einer Datei tauschen



  • Nur so am Rande: Es muss heißen "Can't swap file". Wenn schon Englisch, dann richtig. 😉



  • Hi,

    die Fehler mit den Recht schreibung habe ich behoben. 🙂

    Das Programm habe ich nun um ferror erweitert. Bei einem Test mit einer ca. 500 MB großen Datei fällt das Programm immer bei der Zeile (swap_error(6)) auf die Nase:
    size: 555151434, size: 555150087ERROR [6]: Can't swap file!**
    Ich habe keinen blassen Dunst, warum. Habe ich zu viele ferror- Abfragen eingebaut?

    #include <stdio.h>
    
    //Header
    inline int swap_error(int ferrline);
    
    //< Code
    int main(int argc,const char *argv[]){
    	if(argc!=2){
    		printf("Usage: program <file_to_swap>\n");
    		return(1);
    	}
    	FILE *fh;
    	fh=fopen(argv[1],"r+");
    	if(fh==NULL){
    		printf(" **ERROR: File not found or not read-/ writable!\n");
    		return(2);
    	}
    
    	fseek(fh,0,SEEK_END);
    	if(ferror(fh)) return(swap_error(1));
    	long int size=ftell(fh);
    	long int halfsize=size/2;
    	fseek(fh,0,SEEK_SET);
    	if(ferror(fh)) return(swap_error(2));
    
        long int a,e;
    	long int i;
    	for(i=0;i<halfsize;++i){
            fseek(fh,i,SEEK_SET);
            if(ferror(fh)) return(swap_error(3));
    		if((a=fgetc(fh))==EOF) return(swap_error(4));
    		fseek(fh,size-i-1,SEEK_SET);
            if(ferror(fh)) return(swap_error(5));
    		if((e=fgetc(fh))==EOF) {printf("size: %d, size: %d",size,size-i-1);return(swap_error(6));}
    		fseek(fh,size-i-1,SEEK_SET);
            if(ferror(fh)) return(swap_error(7));
    		fputc(a,fh);
            if(ferror(fh)) return(swap_error(8));
    		fseek(fh,i,SEEK_SET);
            if(ferror(fh)) return(swap_error(9));
    		fputc(e,fh);
            if(ferror(fh)) return(swap_error(10));
    	}
    	fclose(fh);
    	return(0);
    }
    
    inline int swap_error(int ferrline){
    	printf("**ERROR [%d]: Can't swap file!\n",ferrline);
    	return(3);
    }
    //Code >
    

    PS: Danke für die bisherigen Posts...



  • StefanH schrieb:

    Habe ich zu viele ferror- Abfragen eingebaut?

    Ich würde bei kleinen Dateien (Wartezeit < 1 Min) ferror einmalig vor
    fclose(fh) einbauen, bei großen Dateien vllt. noch einmal in der for Schleife.

    Was den anderen Fehler betrifft: zu schönes Wetter heute, es geht jetzt ab in die Sonne! 🙂
    Vllt. hat jemand anders Bock sich da durchzuwuseln.
    LG,
    s.



  • ^^das vorherige 'fseek' zielt wohl ins nichts. wie gross ist die datei denn wirklich?
    🙂



  • Hi,

    genau so groß, wie das 1. size anzeigt:
    529 MB (555.151.434 Bytes)

    (size: 555151434, size: 555150087**ERROR [6]: Can't swap file! )



  • sehr seltsam... warum nimmste eigentlich 'long' statt 'int' für den rückgabewert von fgetc?
    🙂



  • Hi,

    egal ob ich int, long int oder long verwende: Er steigt immer an der gleichen Stelle aus. 😕

    PS: Kompiliert über Dev-C++ (als C-Quellcode natürlich)

    MfG
    SH



  • dann bau das programm mal um, dass es nicht in die gleiche datei schreibt, aus der es liest. vielleicht liegt's daran.
    🙂



  • StefanH schrieb:

    egal ob ich int, long int oder long verwende: Er steigt immer an der gleichen Stelle aus.

    Öffne die Datei "binär":

    fh=fopen(argv[1],"rb+");
    

    Sonst arbeiten fseek() und ftell() nicht korrekt.



  • +fricky schrieb:

    dann bau das programm mal um, dass es nicht in die gleiche datei schreibt, aus der es liest. vielleicht liegt's daran.
    🙂

    niemals.
    🙂



  • Hi,

    was so ein kleines b für Auswirkungen hat...
    (Habe mit einer Tempdatei gearbeitet und dort trat der Fehler auch auf.)

    Es funktioniert soweit ganz gut. Man sollte nur keine größeren Dateien damit 'drehen'. Bei 500 MB warte ich schon ein paar Minuten. Zum Glück ist es für kleinere Dateien gedacht.

    THX


Anmelden zum Antworten