Datei kopieren - read() + write() (SystemCalls)
-
Hallo alle zusammen,
ich möchte ein eine vorhandene Datei in eine neue Datei kopieren. Dabei muss ich mit SystemCalls arbeiten. Die neue Datei wird dabei angelegt. Sobald ich kopieren() aufrufe, hängt das Programm sich im Schleifenkopf auf. Was mache ich falsch ?
#define BSIZE 1024 int main(int argc, int *argv[]) { int file1, file2; int rv = 0; int n; if (file1 = open("file1.txt", O_RDONLY) == -1) { printf("Can't open file1.txt"); rv = 2; } else if (file2 = open("file2.txt", O_WRONLY|O_CREAT) == -1) { printf("Can't open file2"); rv = 3; } else { if ((n = kopieren(file1, file2)) == 1) { /* Aufruf */ printf("Can't open file1.txt"); rv = 2; } else if (n == 2) { printf("Can't write file2.txt"); rv = 3; } } return rv; } int kopieren(int fd_in, int fd_out) { char buffer[BSIZE]; int n; int rv = 0; while ((n = read(fd_in, buffer, BSIZE)) > 0) /* Aufhängen */ if(write(fd_out, buffer, n) == -1) { rv = 2; } return n == -1 ? 1 : rv; }
Beste Grüße
bluma
-
probier mal so:
int filecopy (char *from, char *to) { FILE *in, *out; in = fopen (from, "rb"); if (!in) return 0; out = fopen (to, "wb"); if (!out) { fclose (in); return 0; } while (!feof(in)) { char buff[1024]; size_t bytes_read = fread (buff, 1, sizeof(buff), in); size_t bytes_written = fwrite (buff, 1, bytes_read, out); if (bytes_written != bytes_read) { fclose (in); fclose (out); return 0; } } fclose (in); fclose (out); return 1; }
-
Leider ist mir nur erlaubt mit SystemCalls zu arbeiten und keine f..-funktionen zu benutzen. D.h. ausschließlich read() und write() .
-
hab grad n bisschen rumprobiert und das hier war so sicher nicht beabsichtigt
if (file1 = open("file1.txt", O_RDONLY) == -1) { ... } else if (file2 = open("file2.txt", O_WRONLY|O_CREAT) == -1) { ... }
wenn du dir die if-statements genau anschaust sollte dir was auffallen: zuerst wird der vergleich (open(...) == -1) ausgewertet und das ergebnis (sollte 0 sein) file1/file2 zugewiesen. 0 steht bei read/write allerdings für stdin und deshalb wird immer auf eine eingabe gewartet. du musst richtig klammern dann klappts bestimmt
-
santa klaus schrieb:
wenn du dir die if-statements genau anschaust sollte dir was auffallen: zuerst wird der vergleich (open(...) == -1) ausgewertet und das ergebnis (sollte 0 sein) file1/file2 zugewiesen.
Aaah, endlich. War kein Verständnisfehler sondern einfach Flüchtigkeit. Vielen Dank, jetzt läuft alles wunderbar!
Du hast mir den Abend gerettet.
Beste Grüße
bluma