【问题标题】:Copy one file's content to other file using memcpy()使用 memcpy() 将一个文件的内容复制到另一个文件
【发布时间】:2015-07-17 14:33:49
【问题描述】:

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

My name is John

文件2

I like water

所以我的 resilt 应该是 file2

I like water
My name is John

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

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;
}

但在此之后我的文件 2 看起来像这样

 My name i

为什么?怎么了?

【问题讨论】:

  • 帮自己一个忙,打开所有编译器警告(-Wall -Wextra -pedantic 用于 gcc)。然后作为调试的第一步:修复代码,直到不再发出警告。
  • stat()的调用也错过了错误处理。
  • “大小”应该是一个计算值,每个文件都不同。对于输入文件,stat() 将告诉您制作 mmap 有多大。对于输出文件, stat() 会告诉你文件的原始大小。输出 mmap 需要足够大以包含输入文件的组合长度 + 输出文件的原始长度。将输入文件中的数据复制到输出文件时,输出复制需要在输出文件中已有数据之后开始。都是文本文件,所以建议在插入输入文件内容之前也插入一个空格

标签: c memcpy file-mapping


【解决方案1】:

您需要获取两个文件的大小,并将第一个文件写入第二个文件的end


另外,stat 的第一个参数是文件名,而不是描述符。如果您有描述符,则可以改用fstat

当您传递r 时,您传递的是第一个文件的非终止内容,导致未定义的行为。如果您检查了 stat 返回的内容,您可能会注意到它返回了 -1,因为它失败了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多