c语言实现文件的复制

我最近学习到一个关于c语言复制的函数,自己参照别人的例子做了一点小修改,在此拿来作为自己的第一篇博客。

直接上代码吧:

下面五个参数是文件复制函数要用到的,在此说明它们的作用

filesource 复制的源文件
sourceoffset 复制的起点 相对于文件开头
length 复制的长度 为小于0 时全部复制
filetarget 要复制到的目标文件
targetoffset 复制到目标文件的哪里 (相对于目标文件的开头)

long FileCoppy(FILE *filesource ,long sourceoffset, long length,FILE *filetarget,long targetoffset )
{
  int BufferLen =1024*4;  // 缓冲区的长度
  char *mbuffer=(char*)malloc(BufferLen); // 开辟缓冲区
  int  freadcount=0;  // 调用fread()函数读取到的字节数
  long sumbytes=0;   // 总共复制的字节数
  int  fread_sum=0; // fread() 函数的调用次数
  int i;    // 循环变量

  fseek(filesource,sourceoffset,SEEK_SET); // 将源文件文件指针移动到要复制的起点
  fseek(filetarget,targetoffset,SEEK_SET); // 将目标文件的文件指针移动到要插入内容的的起点
  if(length<0)
  {
       while((freadcount=fread(mbuffer,1,BufferLen ,filesource))>0)
     {
      sumbytes+=freadcount;
      fwrite(mbuffer,freadcount,1,filetarget);// 将缓冲区里的内容写到目标文件

     }
  }
  else  // 复制length个字节的内容
  {
     fread_sum=(int)ceil((double)((double)length/BufferLen));
     for(i=1;i<=fread_sum;i++)
     {
        if(length-sumbytes<BufferLen)  // 读取的数据小于读取长度时
        {
           BufferLen=length-sumbytes;
        }
        freadcount=fread(mbuffer,1,BufferLen,filesource); // 读取的数据大于读取长度时
        fwrite(mbuffer,freadcount,1,filetarget); // 将读取到的数据写到目标文件
        sumbytes+=freadcount;
     }

  }

fflush(filetarget);
free(mbuffer);
return  sumbytes;
}

函数的最后返回值时文件复制的字节数。

需要注意的是要先在你的源文件目录下面创建一个源文件,我创建的是test.txt, 目标文件可以在运行的时候写 会自动生成,文件的后缀记得写哈。
完整的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
long FileCoppy(FILE *filesource ,long sourceoffset, long length,FILE *filetarget,long targetoffset );

int main()
{
    char source[60]; // 储存源文件的文件名
    char target[60]; // 存储目标文件的文件名
    long filesize=0; // 获取文件的复制字节数
      
    printf("要复制的文件:");  // 获取用户输入
    scanf("%s", source);
    printf("将文件复制到:");  // 获取用户输入
    scanf("%s", target);
    FILE *filesource=fopen(source,"rb");
    FILE *filetarget=fopen(target,"wb+");

     if(filesize= FileCoppy(filesource,0 ,-1,filetarget,0))
        {
        printf("恭喜你,文件复制成功!\n");
        printf("复制了%ld个字节\n",filesize);
        }
    else
        printf("文件复制失败!\n");

    return 0;
}

long FileCoppy(FILE *filesource ,long sourceoffset, long length,FILE *filetarget,long targetoffset )
{
  int BufferLen =1024*4;  // 缓冲区的长度
  char *mbuffer=(char*)malloc(BufferLen); // 开辟缓冲区
  int  freadcount=0;  // 调用fread()函数读取到的字节数
  long sumbytes=0;   // 总共复制的字节数
  int  fread_sum=0; // fread() 函数的调用次数
  int i;    // 循环变量

  fseek(filesource,sourceoffset,SEEK_SET); // 将源文件移动到要复制的起点
  fseek(filetarget,targetoffset,SEEK_SET); // 将目标文件移动到要插入内容的的起点
  if(length<0)
  {
       while((freadcount=fread(mbuffer,1,BufferLen ,filesource))>0)
     {
      sumbytes+=freadcount;
      fwrite(mbuffer,freadcount,1,filetarget);// 将缓冲区里的内容写到目标文件

     }
  }
  else  // 复制length个字节的内容
  {
     fread_sum=(int)ceil((double)((double)length/BufferLen));
     for(i=1;i<=fread_sum;i++)
     {
        if(length-sumbytes<BufferLen)  // 读取的数据小于读取长度时
        {
           BufferLen=length-sumbytes;
        }
        freadcount=fread(mbuffer,1,BufferLen,filesource); // 读取的数据大于读取长度时
        fwrite(mbuffer,freadcount,1,filetarget); // 将读取到的数据写到目标文件
        sumbytes+=freadcount;
     }

  }
fflush(filetarget);
free(mbuffer);
return  sumbytes;
}

 

测试截图如下:
在这里插入图片描述
第一次写文章,没什么经验,就简陋一点了,希望对你有帮助。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值