将生成的编码输出到文件里,用C语言完成
时间: 2023-06-14 19:08:34 浏览: 61
在C语言中,我们可以使用标准库函数 `fprintf` 将生成的编码输出到文件中。下面是一个示例代码:
```c
#include <stdio.h>
int main() {
// 假设生成的编码是一个字符串
char encoding[] = "123456789";
// 打开文件,以写入模式打开
FILE *fp = fopen("encoding.txt", "w");
if (fp == NULL) {
printf("无法打开文件。\n");
return 1;
}
// 将编码输出到文件中
fprintf(fp, "%s", encoding);
// 关闭文件
fclose(fp);
return 0;
}
```
在上面的代码中,我们使用 `fopen` 函数打开一个名为 "encoding.txt" 的文件,并以写入模式打开它。如果文件无法打开,函数会返回 `NULL`。接着,我们使用 `fprintf` 函数将生成的编码输出到文件中。最后,我们使用 `fclose` 函数关闭文件。
注意,如果文件已经存在,那么写入模式会覆盖原有内容。如果你需要追加内容,可以使用追加模式打开文件,如下所示:
```c
FILE *fp = fopen("encoding.txt", "a");
```
这样,每次写入操作都会将内容追加到文件末尾。
相关问题
c语言实现哈夫曼编码压缩文件并输出压缩比
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义哈夫曼树节点结构体
typedef struct HuffmanNode {
unsigned char data; // 字符数据
int freq; // 字符频率
struct HuffmanNode *left; // 左子节点
struct HuffmanNode *right; // 右子节点
} HuffmanNode;
// 定义哈夫曼编码结构体
typedef struct HuffmanCode {
unsigned char data; // 字符数据
char *code; // 字符编码
} HuffmanCode;
// 创建哈夫曼树
HuffmanNode* createHuffmanTree(unsigned char *data, int *freq, int size) {
// 创建叶子节点数组
HuffmanNode **nodes = (HuffmanNode**)malloc(size * sizeof(HuffmanNode*));
for (int i = 0; i < size; i++) {
nodes[i] = (HuffmanNode*)malloc(sizeof(HuffmanNode));
nodes[i]->data = data[i];
nodes[i]->freq = freq[i];
nodes[i]->left = NULL;
nodes[i]->right = NULL;
}
// 构建哈夫曼树
while (size > 1) {
// 找到频率最小的两个节点
int min1 = 0, min2 = 1;
if (nodes[min1]->freq > nodes[min2]->freq) {
int temp = min1;
min1 = min2;
min2 = temp;
}
for (int i = 2; i < size; i++) {
if (nodes[i]->freq < nodes[min1]->freq) {
min2 = min1;
min1 = i;
} else if (nodes[i]->freq < nodes[min2]->freq) {
min2 = i;
}
}
// 创建新节点,将两个最小频率的节点作为子节点
HuffmanNode *newNode = (HuffmanNode*)malloc(sizeof(HuffmanNode));
newNode->data = 0;
newNode->freq = nodes[min1]->freq + nodes[min2]->freq;
newNode->left = nodes[min1];
newNode->right = nodes[min2];
// 删除已经合并的节点
if (min1 < min2) {
nodes[min1] = newNode;
nodes[min2] = nodes[size - 1];
} else {
nodes[min2] = newNode;
nodes[min1] = nodes[size - 1];
}
size--;
}
// 返回根节点
return nodes[0];
}
// 生成哈夫曼编码
void generateHuffmanCode(HuffmanNode *root, char *code, int depth, HuffmanCode *codes) {
if (root->left == NULL && root->right == NULL) {
// 叶子节点,保存编码
codes[root->data].data = root->data;
codes[root->data].code = (char*)malloc((depth + 1) * sizeof(char));
strcpy(codes[root->data].code, code);
codes[root->data].code[depth] = '\0';
} else {
// 非叶子节点,递归生成编码
code[depth] = '0';
generateHuffmanCode(root->left, code, depth + 1, codes);
code[depth] = '1';
generateHuffmanCode(root->right, code, depth + 1, codes);
}
}
// 压缩文件
void compressFile(const char *inputFile, const char *outputFile, HuffmanCode *codes) {
FILE *input = fopen(inputFile, "rb");
FILE *output = fopen(outputFile, "wb");
// 写入编码表大小
int codeSize = 0;
for (int i = 0; i < 256; i++) {
if (codes[i].code != NULL) {
codeSize++;
}
}
fwrite(&codeSize, sizeof(int), 1, output);
// 写入编码表
for (int i = 0; i < 256; i++) {
if (codes[i].code != NULL) {
fwrite(&codes[i].data, sizeof(unsigned char), 1, output);
int codeLength = strlen(codes[i].code);
fwrite(&codeLength, sizeof(int), 1, output);
fwrite(codes[i].code, sizeof(char), codeLength, output);
}
}
// 压缩文件内容
unsigned char buffer = 0;
int bitCount = 0;
unsigned char ch;
while (fread(&ch, sizeof(unsigned char), 1, input) > 0) {
int codeLength = strlen(codes[ch].code);
for (int i = 0; i < codeLength; i++) {
if (codes[ch].code[i] == '1') {
buffer |= (1 << (7 - bitCount));
}
bitCount++;
if (bitCount == 8) {
fwrite(&buffer, sizeof(unsigned char), 1, output);
buffer = 0;
bitCount = 0;
}
}
}
// 写入最后一个字节
if (bitCount > 0) {
fwrite(&buffer, sizeof(unsigned char), 1, output);
}
fclose(input);
fclose(output);
}
// 计算文件大小
long long getFileSize(const char *filename) {
FILE *file = fopen(filename, "rb");
fseek(file, 0, SEEK_END);
long long size = ftell(file);
fclose(file);
return size;
}
int main() {
// 读取文件内容
const char *filename = "input.txt";
FILE *file = fopen(filename, "rb");
fseek(file, 0, SEEK_END);
int fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
unsigned char *data = (unsigned char*)malloc(fileSize * sizeof(unsigned char));
fread(data, sizeof(unsigned char), fileSize, file);
fclose(file);
// 统计字符频率
int freq[256] = {0};
for (int i = 0; i < fileSize; i++) {
freq[data[i]]++;
}
// 创建哈夫曼树
HuffmanNode *root = createHuffmanTree(data, freq, 256);
// 生成哈夫曼编码
char code[256];
HuffmanCode codes[256];
memset(code, 0, sizeof(code));
generateHuffmanCode(root, code, 0, codes);
// 压缩文件
compressFile("input.txt", "output
c语言哈夫曼编码压缩文件
C语言实现哈夫曼编码压缩文件的过程可以分为以下几个步骤:
1. 统计字符频率:从输入的文本文件中读取字符,并统计每个字符出现的频率。
2. 构建哈夫曼树:根据字符频率构建哈夫曼树。哈夫曼树是一种最优二叉树,其中频率较低的字符位于树的较低层,频率较高的字符位于树的较高层。
3. 生成哈夫曼编码表:通过遍历哈夫曼树,为每个字符生成对应的哈夫曼编码。哈夫曼编码是由0和1组成的二进制编码,用于表示每个字符。
4. 压缩文件:将输入的文本文件中的字符根据哈夫曼编码表进行编码,并将编码后的二进制数据写入输出文件。这样可以实现对文本文件的压缩。
5. 计算压缩率:通过比较压缩后的文件大小与原始文件大小,计算出压缩率。压缩率越高,表示压缩效果越好。
6. 解压文件:读取压缩文件中的二进制数据,并根据哈夫曼编码表进行解码,将解码后的字符写入输出文件。这样可以实现对压缩文件的解压缩。
以下是一个C语言实现哈夫曼编码压缩文件的示例代码:
```c
// 哈夫曼树节点结构体
typedef struct Node {
char data; // 字符
int freq; // 频率
struct Node* left;
struct Node* right;
} Node;
// 构建哈夫曼树
Node* buildHuffmanTree(char* text);
// 生成哈夫曼编码表
void generateHuffmanCodes(Node* root, char* code, int depth, char** codes);
// 压缩文件
void compressFile(char* inputFile, char* outputFile, char** codes);
// 解压文件
void decompressFile(char* inputFile, char* outputFile, Node* root);
// 计算文件大小
long getFileSize(FILE* file);
// 计算压缩率
float calculateCompressionRatio(long originalSize, long compressedSize);
int main() {
char* inputFile = "input.txt";
char* compressedFile = "compressed.bin";
char* decompressedFile = "decompressed.txt";
// 构建哈夫曼树
Node* root = buildHuffmanTree(inputFile);
// 生成哈夫曼编码表
char* codes[256];
generateHuffmanCodes(root, "", 0, codes);
// 压缩文件
compressFile(inputFile, compressedFile, codes);
// 解压文件
decompressFile(compressedFile, decompressedFile, root);
// 计算文件大小和压缩率
FILE* inputFilePtr = fopen(inputFile, "rb");
FILE* compressedFilePtr = fopen(compressedFile, "rb");
long originalSize = getFileSize(inputFilePtr);
long compressedSize = getFileSize(compressedFilePtr);
float compressionRatio = calculateCompressionRatio(originalSize, compressedSize);
printf("Compression ratio: %.2f%%\n", compressionRatio);
// 释放内存
// ...
return 0;
}
```
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)