【C语言】文件拷贝(块读写)
代码如下,可自行设置传输指针空间大小,修改宏定义SIZE值即可,其余的看注释,底部附执行流程图与拷贝后文件对比。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/types.h"
#include "sys/stat.h"
#define SIZE (1024 * 1024) //拷贝指针容量1M
int main(int argc, char *argv[]) {
//参数提醒
if (argc < 3) {
printf("Missing radix parameter!\n");
return -1;
}
//文件属性结构体
struct stat *st;
//文件指针(获取argv[]命令作为文件路径)
FILE *sour = fopen(argv[1], "r");
FILE *dest = fopen(argv[2], "w");
//printf("File Size:%ldByte\n", st->st_size);
//判空
if (!sour || !dest) {
printf("Copy file failed!\n");
return -2;
}
//开辟拷贝暂存指针空间
char *p = NULL;
//保证小文件拷贝时开辟具体空间大小
long size = 0;
//记录文件属性
stat(argv[1], st);
//开辟空间
if (st->st_size > SIZE) {
p = (char*)malloc(sizeof(char) * SIZE);
size = SIZE;
} else {
p = (char*)malloc(sizeof(char) * st->st_size + 10);
size = st->st_size + 10;
}
//fread()函数成功会返回有效字符个数,用i来记录
long count = 0;
//开始拷贝
while (!feof(sour)) {
//指针空间置空
memset(p, 0, size);
//读写(块)
count = fread(p, sizeof(char), size, sour);
fwrite(p, sizeof(char), count, dest);
}
//成功提醒
printf("Copy files successfully!\n");
//释放空间,关闭文件
free(p);
fclose(sour);
fclose(dest);
return 0;
}
执行图:
对比图: