C 创建压缩包并写入文件
时间: 2024-01-20 07:03:20 浏览: 19
要创建一个压缩包并写入文件,需要使用 zlib 库提供的函数。下面是一个示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
return 1;
}
char *input_filename = argv[1];
char *output_filename = argv[2];
// 打开输入文件
FILE *input_file = fopen(input_filename, "rb");
if (input_file == NULL) {
perror("Failed to open input file");
return 1;
}
// 打开输出文件
FILE *output_file = fopen(output_filename, "wb");
if (output_file == NULL) {
perror("Failed to open output file");
fclose(input_file);
return 1;
}
// 初始化 zlib 压缩器
z_stream stream;
memset(&stream, 0, sizeof(stream));
deflateInit(&stream, Z_DEFAULT_COMPRESSION);
// 循环读取输入文件,压缩数据,并写入输出文件
char input_buffer[1024];
char output_buffer[1024];
stream.avail_out = sizeof(output_buffer);
stream.next_out = (Bytef *)output_buffer;
int ret;
do {
stream.avail_in = fread(input_buffer, 1, sizeof(input_buffer), input_file);
if (stream.avail_in == 0) {
break;
}
stream.next_in = (Bytef *)input_buffer;
do {
ret = deflate(&stream, Z_FINISH);
if (ret == Z_STREAM_ERROR) {
perror("Failed to compress data");
fclose(input_file);
fclose(output_file);
deflateEnd(&stream);
return 1;
}
int bytes_written = fwrite(output_buffer, 1, sizeof(output_buffer) - stream.avail_out, output_file);
if (bytes_written == 0) {
perror("Failed to write compressed data");
fclose(input_file);
fclose(output_file);
deflateEnd(&stream);
return 1;
}
stream.avail_out = sizeof(output_buffer);
stream.next_out = (Bytef *)output_buffer;
} while (stream.avail_out == 0);
} while (ret != Z_STREAM_END);
// 结束 zlib 压缩器
deflateEnd(&stream);
// 关闭文件
fclose(input_file);
fclose(output_file);
return 0;
}
```
这个程序可以通过命令行参数指定输入文件和输出文件。它会读取输入文件的内容,对其进行压缩,并将压缩后的数据写入输出文件中。你可以通过调整压缩级别等参数来优化压缩效果。