首页  > 教育解读  > c语言如何复制二进制文件内容

c语言如何复制二进制文件内容

2025-05-03 16:56:32
星海幻梦
星海幻梦已认证

星海幻梦为您分享以下优质知识

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

}

```

四、注意事项

错误处理

检查文件打开、读写及内存分配是否成功,避免程序崩溃。

大文件处理