用c语言编写一个程序,可以在命令行输入参数,完成指定文件的压缩解压 命令行参数如下 rle file1 –c(-d) file2 第一个参数为可执行程序名称,第二个参数为原始文件名,第三个参数为压缩或解压缩选项,第四个参数为新文件名
时间: 2024-02-18 20:05:52 浏览: 20
好的,下面是用 C 语言实现的 RLE 压缩/解压缩程序,支持命令行参数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void rle_compress(unsigned char *data, size_t size, unsigned char *compressed, size_t *compressed_size) {
size_t i, j, count;
for (i = 0, j = 0; i < size; i++) {
count = 1;
while (i < size - 1 && data[i] == data[i+1] && count < 127) {
count++;
i++;
}
compressed[j++] = count + 127;
compressed[j++] = data[i];
}
*compressed_size = j;
}
void rle_decompress(unsigned char *compressed, size_t compressed_size, unsigned char *data, size_t *size) {
size_t i, j, count;
for (i = 0, j = 0; i < compressed_size; i += 2) {
count = compressed[i] - 127;
while (count--) {
data[j++] = compressed[i+1];
}
}
*size = j;
}
void compress_file(const char *filename, const char *output_filename) {
FILE *in = fopen(filename, "rb");
if (!in) {
fprintf(stderr, "Error: cannot open file '%s'\n", filename);
exit(1);
}
fseek(in, 0, SEEK_END);
size_t size = ftell(in);
fseek(in, 0, SEEK_SET);
unsigned char *data = malloc(size);
fread(data, 1, size, in);
fclose(in);
unsigned char *compressed = malloc(size * 2);
size_t compressed_size;
rle_compress(data, size, compressed, &compressed_size);
FILE *out = fopen(output_filename, "wb");
if (!out) {
fprintf(stderr, "Error: cannot open file '%s'\n", output_filename);
exit(1);
}
fwrite(compressed, 1, compressed_size, out);
fclose(out);
free(data);
free(compressed);
}
void decompress_file(const char *filename, const char *output_filename) {
FILE *in = fopen(filename, "rb");
if (!in) {
fprintf(stderr, "Error: cannot open file '%s'\n", filename);
exit(1);
}
fseek(in, 0, SEEK_END);
size_t compressed_size = ftell(in);
fseek(in, 0, SEEK_SET);
unsigned char *compressed = malloc(compressed_size);
fread(compressed, 1, compressed_size, in);
fclose(in);
unsigned char *data = malloc(compressed_size * 2);
size_t size;
rle_decompress(compressed, compressed_size, data, &size);
FILE *out = fopen(output_filename, "wb");
if (!out) {
fprintf(stderr, "Error: cannot open file '%s'\n", output_filename);
exit(1);
}
fwrite(data, 1, size, out);
fclose(out);
free(data);
free(compressed);
}
int main(int argc, char **argv) {
if (argc != 5) {
fprintf(stderr, "Usage: %s <input_file> -c|-d <output_file>\n", argv[0]);
exit(1);
}
const char *input_filename = argv[1];
const char *output_filename = argv[4];
if (strcmp(argv[2], "-c") == 0) {
compress_file(input_filename, output_filename);
} else if (strcmp(argv[2], "-d") == 0) {
decompress_file(input_filename, output_filename);
} else {
fprintf(stderr, "Usage: %s <input_file> -c|-d <output_file>\n", argv[0]);
exit(1);
}
return 0;
}
```
需要注意的是,使用这个程序进行压缩和解压缩时,需要保证输入文件和输出文件的大小不超过程序中定义的 `size` 常量(默认为 1MB)。