
星海幻梦为您分享以下优质知识
在C语言中复制二进制文件内容可通过以下步骤实现,结合了高效读写方法及错误处理:
一、核心函数与模式
文件打开模式
使用`"rb"`(读二进制)模式打开源文件,使用`"wb"`(写二进制)模式打开目标文件,确保按原始二进制格式读写。
文件读写函数
- `fread()`:从源文件读取数据到缓冲区(如`fread(buf, sizeof(char), MAXLEN, infile)`)。
- `fwrite()`:将缓冲区数据写入目标文件(如`fwrite(buf, sizeof(char), rc, outfile)`)。
文件关闭
使用`fclose()`关闭文件以释放资源。
二、高效复制方法
分块读写
通过循环读取固定大小块(如1024字节)并写入目标文件,避免一次性分配大内存空间。示例如下:
```c
include
define BUFFER_SIZE 1024
int main() {
FILE *src, *dest;
char buffer[BUFFER_SIZE];
size_t bytes_read;
src = fopen("source.bin", "rb");
dest = fopen("destination.bin", "wb");
if (!src || !dest) {
perror("文件打开失败");
return 1;
}
while ((bytes_read = fread(buffer, sizeof(char), BUFFER_SIZE, src)) >
0) {
if (!fwrite(buffer, sizeof(char), bytes_read, dest)) {
perror("文件写入失败");
fclose(src);
fclose(dest);
return 1;
}
}
if (ferror(src) || ferror(dest)) {
perror("文件操作错误");
}
fclose(src);
fclose(dest);
return 0;
}
```
使用`lseek`获取文件大小
通过`fseek`定位到文件末尾并使用`ftell`获取文件大小,避免逐字节循环。示例如下:
```c
fseek(src, 0, SEEK_END);
size_t length = ftell(src);
fseek(src, 0, SEEK_SET);
```
三、完整示例程序
以下是一个综合上述方法的完整示例,支持命令行参数输入文件路径:
```c
include
include
include
define BUFFER_SIZE 1024
int copyFile(const char *src, const char *dest) {
FILE *src_file = fopen(src, "rb");
FILE *dest_file = fopen(dest, "wb");
if (!src_file || !dest_file) {
perror("文件打开失败");
return -1;
}
size_t length = ftell(src_file);
if (length == -1) {
perror("获取文件大小失败");
fclose(src_file);
fclose(dest_file);
return -1;
}
fseek(src_file, 0, SEEK_SET);
char *buffer = malloc(length + 1); // +1 for null terminator
if (!buffer) {
perror("内存分配失败");
fclose(src_file);
fclose(dest_file);
return -1;
}
size_t bytes_read;
while ((bytes_read = fread(buffer, sizeof(char), length, src_file)) >
0) {
if (!fwrite(buffer, sizeof(char), bytes_read, dest_file)) {
perror("文件写入失败");
free(buffer);
fclose(src_file);
fclose(dest_file);
return -1;
}
}
if (bytes_read != length) {
perror("文件读取不完整");
free(buffer);
fclose(src_file);
fclose(dest_file);
return -1;
}
free(buffer);
fclose(src_file);
fclose(dest_file);
return 0;
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("用法: %s n", argv);
return 1;
}
if (copyFile(argv, argv) != 0) {
printf("文件复制失败!n");
return 1;
}
printf("文件复制成功!n");
return 0;
}
```
四、注意事项
错误处理
检查文件打开、读写及内存分配是否成功,避免程序崩溃。
大文件处理