memcpy und mapped files
-
ok zweite aufgabe bei uns ist den inhalt einer datei mittels memcpy in eine andere zu kopieren. Aber irgendwo hab ich noch nen groben denkfehler hier mal mein bisheriger code:
void * filefromstart = mmap(NULL, filefromstr.st_size, PROT_READ, MAP_SHARED, filefrom , 0); if ( filefromstart == (void*)(-1) ) { perror("Error mapping sourcefile"); close(filefrom); close(fileto); return EXIT_FAILURE; } void * filetostart = mmap(NULL, filefromstr.st_size, PROT_WRITE | PROT_READ, MAP_SHARED, fileto, 0); short ok = 1; if ( filetostart == (void*)(-1) ) { perror("Error mapping targetfile"); close(filefrom); close(fileto); if ( munmap( filetostart, filefromstr.st_size ) == -1 ) { perror("Error umapping sourcefile"); ok = 0; } return EXIT_FAILURE; } printf("vor memcopy\n"); if (memcpy( filetostart, filefromstart, filefromstr.st_size) == NULL )
filefrom ist rdonly und fileto ist rdwr geöffnet aber beim memcopy kommt ein buserror, meine vermutung ist da ja fileto die länge null hat aber in mehr speicher gemapped wird kann ich dort nicht so einfach reinschreiben. Weiss aber nicht ob das wirklich der Fehler ist, und wenn wie ich das dann trotzdem machen kann.
-
Hallo Fedaykin
der nachfolgende Code macht genau das, was du willst.
Deine Vermutung war genau richtig. Du musst die Größe
der neuen Datei noch setzen, bevor du in diese dann
reinschreibst.Gruss mcr
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <string.h> static size_t fsize(const char *const name) { struct stat stbuf; if(stat(name, &stbuf) == -1) return -1; return stbuf.st_size; } int main(void) { int fdread = open("data.txt", O_RDWR); int fdwrite = open("data.txt.new", O_RDWR|O_CREAT,0660); size_t size = fsize("data.txt"); void *fpread = mmap(NULL, size, PROT_READ, MAP_SHARED, fdread, 0); void *fpwrite = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fdwrite, 0); /* Größe der neuen Daten setzen */ lseek(fdwrite, size-1, SEEK_SET); write(fdwrite, "", 1); close(fdread); close(fdwrite); memcpy(fpwrite, fpread, size); munmap(fpread, size); munmap(fpwrite, size); return 0; }