Обновить sk1/compressor.c
This commit is contained in:
		
							parent
							
								
									4f7f2b98c9
								
							
						
					
					
						commit
						7830f11bdf
					
				| @ -123,6 +123,8 @@ struct MinHeapNode* buildHuffmanTree(unsigned char data[], int freq[], int size) | |||||||
| 
 | 
 | ||||||
| // Print Huffman Codes to a map
 | // Print Huffman Codes to a map
 | ||||||
| void storeCodes(struct MinHeapNode* root, char** codes, char* currentCode, int top) { | void storeCodes(struct MinHeapNode* root, char** codes, char* currentCode, int top) { | ||||||
|  |     if (!root) return; | ||||||
|  | 
 | ||||||
|     if (root->left) { |     if (root->left) { | ||||||
|         currentCode[top] = '0'; |         currentCode[top] = '0'; | ||||||
|         storeCodes(root->left, codes, currentCode, top + 1); |         storeCodes(root->left, codes, currentCode, top + 1); | ||||||
| @ -133,11 +135,11 @@ void storeCodes(struct MinHeapNode* root, char** codes, char* currentCode, int t | |||||||
|     } |     } | ||||||
|     if (!(root->left) && !(root->right)) { |     if (!(root->left) && !(root->right)) { | ||||||
|         currentCode[top] = '\0'; |         currentCode[top] = '\0'; | ||||||
|         codes[root->data] = strdup(currentCode); |         codes[root->data] = strdup(currentCode); // Ensure memory is allocated
 | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Compress the input file using Huffman Coding
 | // Updated compressFile function
 | ||||||
| int compressFile(const char* input_file_name, const char* output_file_name) { | int compressFile(const char* input_file_name, const char* output_file_name) { | ||||||
|     FILE* inputFile = fopen(input_file_name, "rb"); |     FILE* inputFile = fopen(input_file_name, "rb"); | ||||||
|     if (!inputFile) { |     if (!inputFile) { | ||||||
| @ -166,7 +168,7 @@ int compressFile(const char* input_file_name, const char* output_file_name) { | |||||||
| 
 | 
 | ||||||
|     struct MinHeapNode* root = buildHuffmanTree(data, frequencies, size); |     struct MinHeapNode* root = buildHuffmanTree(data, frequencies, size); | ||||||
|     char* codes[256] = {0}; |     char* codes[256] = {0}; | ||||||
|     char currentCode[MAX_TREE_HT]; |     char currentCode[MAX_TREE_HT] = {0}; // Initialize to avoid garbage values
 | ||||||
|     storeCodes(root, codes, currentCode, 0); |     storeCodes(root, codes, currentCode, 0); | ||||||
| 
 | 
 | ||||||
|     FILE* outputFile = fopen(output_file_name, "wb"); |     FILE* outputFile = fopen(output_file_name, "wb"); | ||||||
| @ -183,6 +185,12 @@ int compressFile(const char* input_file_name, const char* output_file_name) { | |||||||
|     int bitCount = 0; |     int bitCount = 0; | ||||||
|     while (fread(&buffer, sizeof(unsigned char), 1, inputFile)) { |     while (fread(&buffer, sizeof(unsigned char), 1, inputFile)) { | ||||||
|         char* code = codes[buffer]; |         char* code = codes[buffer]; | ||||||
|  |         if (!code) { | ||||||
|  |             fprintf(stderr, "Error: Undefined code for byte %u\n", buffer); | ||||||
|  |             fclose(inputFile); | ||||||
|  |             fclose(outputFile); | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|         for (int i = 0; code[i] != '\0'; i++) { |         for (int i = 0; code[i] != '\0'; i++) { | ||||||
|             byte = (byte << 1) | (code[i] - '0'); |             byte = (byte << 1) | (code[i] - '0'); | ||||||
|             bitCount++; |             bitCount++; | ||||||
| @ -200,9 +208,15 @@ int compressFile(const char* input_file_name, const char* output_file_name) { | |||||||
| 
 | 
 | ||||||
|     fclose(inputFile); |     fclose(inputFile); | ||||||
|     fclose(outputFile); |     fclose(outputFile); | ||||||
|  | 
 | ||||||
|  |     // Free memory for codes
 | ||||||
|  |     for (int i = 0; i < 256; i++) { | ||||||
|  |         if (codes[i]) free(codes[i]); | ||||||
|  |     } | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| // Decompress the file
 | // Decompress the file
 | ||||||
| int decompressFile(const char* input_file_name, const char* output_file_name) { | int decompressFile(const char* input_file_name, const char* output_file_name) { | ||||||
|     FILE* inputFile = fopen(input_file_name, "rb"); |     FILE* inputFile = fopen(input_file_name, "rb"); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user