1

我需要将 file1 上下文复制到 file2。这是我的文件 file1

My name is John

文件2

I like water

所以我的resilt应该是file2

I like water
My name is John

我必须使用mmapandmemcpy为此。所以在这里我做什么首先我打开两个文件

int da_open(const char *name){
   int dskr;
   dskr = open( name, O_RDWR );
   if( dskr == -1 ){
      perror( name );
      exit(1);
   }
   printf( "dskr1 = %d\n", dskr );
   return dskr;
}

然后我映射我的文件

void *da_mmap1( int d, int size ){
   void *a = NULL;
   a = mmap( NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, d, 0 );
   if( a == MAP_FAILED ){
      perror( "mmap failed" );
      abort();
   }
   return a;
}

这是我的 memcpy

void *da_memcpy(void *str1, const void *str2, size_t n){
    return memcpy(str1, str2, n);
}

和我的主要

int main(int argc, char *argv[] ){
    struct stat fileStat;
    int st;
    int d1;
    int d2;
    void *r = NULL;
    void *w = NULL;
    if(argc == 3){
        d1 = da_open(argv[1]);
        d2 = da_open(argv[2]);
        r = da_mmap1(d1, SIZE);
        w = da_mmap1(d2, SIZE);
        st = stat(r, &fileStat);
        printf("Tik skaitoma: %d\n", fileStat.st_size);
        da_memcpy(w,r,fileStat.st_size);
        da_munamp(r, SIZE);
        da_munamp(w, SIZE);
        da_close(d1);
        da_close(d2);
    }
    return 0;
}

但在此之后,我的 file2 看起来像这样

 My name i

为什么?怎么了?

4

1 回答 1

4

您需要获取两个文件的大小,并将第一个文件写在第二个文件的末尾


此外,第一个参数stat文件名而不是描述符。如果你有一个描述符,你可以使用它fstat

当您通过时,r您将第一个文件的未终止内容传递给它,从而导致未定义的行为。如果您检查stat返回的内容,您可能会注意到它-1在失败时返回。

于 2015-05-07T07:01:00.347 回答