我最近学习到一个关于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
#include
#include
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;
}