Приведенный ниже код должен взять файл TXT и сжать в файл bin. Затем, если он будет предложен, он должен занять тот же двоичный файл и распаковать его в другой файл TXT. < /P>
В этом коде используется алгоритм кодирования Хаффмана для сжатия. Я пробовал сжатие, которое работало нормально, но декомпрессия не работает должным образом.#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct TreeNode
{
char data;
unsigned int freq;
TreeNode *right, *left;
TreeNode(char d, unsigned int f)
{
data = d;
freq = f;
right = nullptr;
left = nullptr;
}
};
struct CompareNodes
{
bool operator()(TreeNode *left, TreeNode *right)
{
return left->freq > right->freq;
}
};
class Solution
{
private:
void deleteTree(TreeNode *node)
{
if (node == nullptr)
return;
deleteTree(node->left);
deleteTree(node->right);
delete node;
}
unordered_map loadFile(const string &filename)
{
unordered_map freq;
ifstream file(filename, ios::binary);
if (!file.is_open())
{
cout right)
{
codeMaps[node->data] = currentString.empty() ? "0" : currentString;
return;
}
generateCodes(node->left, currentString + '0', codeMaps);
generateCodes(node->right, currentString + '1', codeMaps);
}
public:
void compress(const string &filename, const string &outputFile)
{
unordered_map mp = loadFile(filename);
if (mp.empty())
{
cout left = single;
newRoot->right = nullptr;
minHeap.pop();
minHeap.push(newRoot);
}
while (minHeap.size() > 1)
{
TreeNode *l = minHeap.top();
minHeap.pop();
TreeNode *r = minHeap.top();
minHeap.pop();
TreeNode *newNode = new TreeNode('\0', l->freq + r->freq);
newNode->left = l;
newNode->right = r;
minHeap.push(newNode);
}
TreeNode *root = minHeap.top();
unordered_map codeMaps;
generateCodes(root, "", codeMaps);
long long total_chars = 0;
for (const auto &pair : mp)
{
total_chars += pair.second;
}
ofstream outFile(outputFile, ios::binary);
if (!outFile.is_open())
{
cout
Подробнее здесь: https://stackoverflow.com/questions/797 ... my-project