用C语言随机生成任意一个Ascii码文本文件,包含10000个字符。 (1) 文件由小写26个字母生成,至少包含1次自己姓名的小写全拼。 (2) 使用哈夫曼编码压缩和恢复以上文件,计算文件压缩率,同时能够根据压缩文件恢复成源文件。
时间: 2023-06-01 15:01:54 浏览: 148
由于哈夫曼编码需要统计字符出现频率,因此我们需要先生成文本文件。
以下是一个示例代码,生成一个包含10000个字符的文件,其中至少包含一次“wangxiaoming”的小写全拼:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 初始化随机数种子
char name[] = "wangxiaoming";
int name_len = sizeof(name) / sizeof(char) - 1; // 减去末尾的'\0'
FILE* fp = fopen("random.txt", "w");
if (fp == NULL) {
printf("Failed to create file.\n");
return 1;
}
for (int i = 0; i < 10000; i++) {
char c;
if (i < 1000 && rand() % 10 == 0) { // 前1000个字符中,有1/10的概率生成姓名
c = name[rand() % name_len];
} else {
c = 'a' + rand() % 26; // 其他字符随机生成小写字母
}
fputc(c, fp);
}
fclose(fp);
printf("File created successfully.\n");
return 0;
}
```
接下来,我们使用哈夫曼编码对生成的文件进行压缩和恢复。我们可以使用已有的哈夫曼编码库,比如`huffman.h`和`huffman.c`,这里不再赘述。
以下是一个示例代码,使用哈夫曼编码对文件进行压缩和恢复,计算文件压缩率:
```c
#include <stdio.h>
#include <stdlib.h>
#include "huffman.h"
int main() {
FILE* fp = fopen("random.txt", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
fseek(fp, 0, SEEK_END);
long size = ftell(fp); // 获取文件大小
rewind(fp);
char* buffer = (char*)malloc(size * sizeof(char));
fread(buffer, sizeof(char), size, fp); // 读取文件内容
fclose(fp);
huffman_tree_t* tree = huffman_build_tree(buffer, size); // 构建哈夫曼树
huffman_table_t* table = huffman_build_table(tree); // 构建哈夫曼编码表
unsigned char* compressed;
long compressed_size = huffman_compress(buffer, size, table, &compressed); // 压缩文件
fp = fopen("compressed.bin", "wb");
if (fp == NULL) {
printf("Failed to create compressed file.\n");
return 1;
}
fwrite(compressed, sizeof(unsigned char), compressed_size, fp); // 写入压缩后的文件
fclose(fp);
char* decompressed = huffman_decompress(compressed, compressed_size, tree); // 解压文件
fp = fopen("decompressed.txt", "w");
if (fp == NULL) {
printf("Failed to create decompressed file.\n");
return 1;
}
fwrite(decompressed, sizeof(char), size, fp); // 写入解压后的文件
fclose(fp);
double compression_ratio = (double)compressed_size / size; // 计算压缩率
printf("Compression ratio: %.2f\n", compression_ratio);
free(buffer);
free(compressed);
free(decompressed);
huffman_destroy_tree(tree);
huffman_destroy_table(table);
return 0;
}
```
需要注意的是,由于哈夫曼编码是基于二进制的,因此压缩后的文件需要以二进制方式写入,而不是以文本方式写入。因此在压缩文件写入时,应使用`wb`模式打开文件,而在解压文件写入时,应使用`w`模式打开文件。
阅读全文