Kopieren von Dateien mithilfe von fread und fwrite



  • Hallo ich habe eine Funktion geschrieben und würde gerne eure Meinung hören. Ich habe bedenken wegen der Codesequenz in fread. Falls es einmal nicht klappen
    sollte, würde die Datei nur zur Hälfte kopiert, also mittendrin fread eine 0 liefert. Kann das überhaupt passieren ?
    Dann würde ich nämlich noch ein feof einbauen, um zu überprüfen, ob die Datei auch zuende kopiert wurde. Oder ist das völliger Quatsch und das reicht vollkommen aus ?

    [code="c"]
    int copyFile(char *input, char *output) {
    FILE *in, *out;
    char buffer[8192];
    int Bytes;

    if ((in = fopen(input, "rb")) == NULL)
    return 0;
    if ((out = fopen(output, "wb")) == NULL) {
    fclose(in);
    return 0;
    }

    while ( (Bytes = fread(buffer, sizeof(char), sizeof(buffer), in)) > 0 ) {
    if (Bytes != fwrite(buffer, sizeof(char), Bytes, out)) {
    fclose(in);
    fclose(out);
    return 0;
    }
    }

    fclose(in);
    fclose(out);
    return 1;
    }
    [code]



  • Sry wegen des Codes hier nochmal

    int copyFile(char *input, char *output) {
    	FILE *in, *out;
    	char buffer[8192];
    	int Bytes;
    
    	if ((in = fopen(input, "rb")) == NULL)
    		return 0;
    	if ((out = fopen(output, "wb")) == NULL) {
    		fclose(in);
    		return 0;
    	}
    
    	while ( (Bytes = fread(buffer, sizeof(char), sizeof(buffer), in)) > 0 ) {
    		if (Bytes != fwrite(buffer, sizeof(char), Bytes, out)) {
    			fclose(in);
    			fclose(out);
    			return 0;
    		}
    	}
    
    	fclose(in);
    	fclose(out);
    
    	return 1;
    }
    


  • Lordi schrieb:

    Hallo ich habe eine Funktion geschrieben und würde gerne eure Meinung hören. Ich habe bedenken wegen der Codesequenz in fread. Falls es einmal nicht klappen sollte, würde die Datei nur zur Hälfte kopiert, also mittendrin fread eine 0 liefert. Kann das überhaupt passieren?

    Standard sagt, es kann fehlschlagen -> wahrscheinlich kann es fehlschlagen.



  • fread() kann nicht nur mit 0, sondern auch auch mit anderen Werten kleiner als die Anzahl der Elemente (= sizeof(buffer)) einen Lesefehler bzw. das Dateiende anzeigen. Um das zu unterscheiden, kann z.B. ferror() verwendet werden oder aber die Dateilänge wird vorab ermittelt und nur entsprechend viele Elemente gelesen.

    Außerdem muß ein mögliches Fehlschlagen von fclose() geprüft werden, denn auch wenn fwrite() zuvor O.K. war, wurde die Datei in diesem Fall vermutlicht nicht korrekt geschrieben.


  • Mod

    Ich glaube, die Frage ist eher so gemeint, ob fread auch manchmal aus Jux und Dollerei einfach weniger Zeichen (zum Beispiel 0) liest, als eigentlich möglich wäre. Die Antwort ist: Nein. fread versucht so viele Zeichen zu lesen, wie du als Maximum setzt. Wenn es weniger liest, dann, weil irgendeine Art von Fehler auftrat. In der Regel (d.h. wenn alles gut geht) ist dies das Erreichen des Dateiendes (fread liest dann so viel wie möglich bis zum Ende). Es können natürlich noch echte Fehler passieren, die dieses Verhalten auslösen, beispielsweise wenn dir jemand mitten im Betrieb den USB-Stick abzieht, von dem du die Datei liest.


Anmelden zum Antworten