C语言随机生成任意一个Ascii码文本文件,包含10000个字符
时间: 2023-05-29 15:06:52 浏览: 87
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 设置随机数种子
FILE* fp = fopen("random.txt", "w"); // 打开文件
if (fp == NULL) {
printf("文件打开失败\n");
return 0;
}
for (int i = 0; i < 10000; i++) { // 生成10000个字符
char c = (char)(rand() % 128); // 生成0~127的随机数
fprintf(fp, "%c", c); // 写入文件
}
fclose(fp); // 关闭文件
printf("文件生成成功\n");
return 0;
}
相关问题
用c语言随机生成任意一个Ascii码文本文件,包含10000个字符
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 初始化随机数种子
FILE *fp = fopen("random.txt", "w"); // 打开文件
if(fp == NULL) { // 判断文件是否打开成功
printf("Failed to open file.\n");
return 1;
}
for(int i = 0; i < 10000; i++) { // 循环生成10000个字符
char c = rand() % 128; // 随机生成一个Ascii码字符
fprintf(fp, "%c", c); // 写入文件
}
fclose(fp); // 关闭文件
printf("File generated successfully.\n");
return 0;
}
用C语言随机生成任意一个Ascii码文本文件,包含10000个字符。 (1) 文件由小写26个字母生成,至少包含1次自己姓名的小写全拼。 (2) 使用哈夫曼编码压缩和恢复以上文件,计算文件压缩率,同时能够根据压缩文件恢复成源文件。
由于哈夫曼编码需要统计字符出现频率,因此我们需要先生成文本文件。
以下是一个示例代码,生成一个包含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`模式打开文件。