void compress(istream& input, obitstream& output) { map<int, int> freqTable = buildFrequencyTable(input); HuffmanNode* encodingTree = buildEncodingTree(freqTable); map<int, string> encodingMap = buildEncodingMap(encodingTree); writeHeader(encodingTree, output); input.clear(); input.seekg(0, ios::beg); encodeData(input, encodingMap, output); freeTree(encodingTree); }
//Komprimerar headern genom att se om det finns tal i frekvenstabellen som är större än en byte (255) //Om så är fallet läggs den in i ouputen på samma sätt med en 1 först i filen för att markera det //Annars sätts 0 först i filen samt storleken på frekvenstabellen, alla karaktärer och frekvenser //Skrivs till ouput med .put() //Exempel för example.txt 08322973983991 EOF lägg inte in eftersom den är större än en byte void compress(istream& input, obitstream& output) { map<int, int> freqTable = buildFrequencyTable(input); HuffmanNode* priorityTree = buildEncodingTree(freqTable); map<int, string> encodingMap = buildEncodingMap(priorityTree); bool containsBiggerThanByte = false; vector<char> vectorForFreqTable; for(map<int,int>::iterator it = freqTable.begin(); it != freqTable.end(); ++it){ if(it->first == PSEUDO_EOF){ //Lägg inte till PSEUDO_EOF än break; } else if(!(it->first > PSEUDO_EOF) && !(it->second > PSEUDO_EOF)){ //Om frekvensen och karaktären tar mindre än en byte vectorForFreqTable.push_back(it->first); vectorForFreqTable.push_back(it->second); }else{ containsBiggerThanByte = true; break; } } if(containsBiggerThanByte){ output.put('1'); //Tal större än en byte finns addBiggerThanByte(freqTable,output); }else{ output.put('0'); //Inget tal större än en byte int freqTableSize = vectorForFreqTable.size(); output.put(freqTableSize); //tabellens storlek kommer användas för inmatningen for(int i = 0; i < freqTableSize; ++i){ int tempNum = vectorForFreqTable.at(i); output.put(tempNum); } } input.clear(); input.seekg(0, ios::beg); encodeData(input, encodingMap, output); freeTree(priorityTree); }