Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <iostream>
- #include <sstream>
- #include "FileUtils.hpp"
- #include "HCNode.hpp"
- #include "HCTree.hpp"
- #include "cxxopts.hpp"
- #define SECOND_ARG 2
- #define NUM_CHARS 256
- /**
- * Pseudo-decompression method that decompresses files based on ASCII and naive
- * header.
- * Params: infileName - input file, outFileName - output file
- * Returns: void
- */
- void pseudoDecompression(string inFileName, string outFileName) {
- ifstream readFile;
- unsigned int nextFreq;
- string num;
- vector<unsigned int> freqs(NUM_CHARS, 0);
- readFile.open(inFileName, ios::binary);
- int i = 0;
- // while file still has bytes to read
- while (std::getline(readFile, num) && i < NUM_CHARS) {
- istringstream freq(num);
- freq >> nextFreq;
- freqs[i] = nextFreq;
- i++;
- }
- // build HCTree
- HCTree tree;
- tree.build(freqs);
- // write to output file
- ofstream writeFile;
- writeFile.open(outFileName);
- // decoded bits
- readFile.clear();
- readFile.seekg(0, readFile.beg);
- int y = 0;
- while (y < NUM_CHARS) {
- readFile.seekg(1, readFile.cur);
- if (readFile.peek() == '\n') {
- y++;
- }
- }
- readFile.seekg(1, readFile.cur);
- while (true) {
- char c = tree.decode(readFile);
- if (readFile.eof()) {
- break;
- }
- writeFile << c;
- }
- readFile.close();
- writeFile.close();
- }
- /**
- * True decompression method that decompresses files based on bitwise i/o and
- * small header.
- * Params: infileName - input file, outFileName - output file
- * Returns: void
- */
- void trueDecompression(string inFileName, string outFileName) {
- ifstream readFile;
- unsigned int nextFreq;
- string num;
- vector<unsigned int> freqs(NUM_CHARS, 0);
- readFile.open(inFileName, ios::binary);
- int i = 0;
- // while file still has bytes to read
- while (std::getline(readFile, num) && i < NUM_CHARS) {
- istringstream freq(num);
- freq >> nextFreq;
- freqs[i] = nextFreq;
- i++;
- }
- // build HCTree
- HCTree tree;
- tree.build(freqs);
- // write to output file
- ofstream writeFile;
- writeFile.open(outFileName, ios::binary);
- // decoded bits
- readFile.clear();
- readFile.seekg(0, readFile.beg);
- int y = 0;
- while (y < NUM_CHARS) {
- readFile.seekg(1, readFile.cur);
- if (readFile.peek() == '\n') {
- y++;
- }
- }
- readFile.seekg(1, readFile.cur);
- string fsizeStr;
- std::getline(readFile, fsizeStr);
- istringstream fsizess(fsizeStr);
- int fsize;
- fsizess >> fsize;
- readFile.clear();
- readFile.seekg(0, readFile.beg);
- y = 0;
- while (y < NUM_CHARS + 1) {
- readFile.seekg(1, readFile.cur);
- if (readFile.peek() == '\n') {
- y++;
- }
- }
- readFile.seekg(1, readFile.cur);
- BitInputStream bis(readFile);
- int decodeCount = 0;
- while (decodeCount < fsize) {
- char c = tree.decode(bis);
- if (readFile.eof()) {
- break;
- }
- writeFile << c;
- decodeCount++;
- }
- readFile.close();
- writeFile.close();
- }
- /**
- * Main program for running decompression, handles parsing and checking files.
- * Params: argc - # of args, argv - command-line args
- * Returns: 0 if successful exit, 1 otherwise
- */
- int main(int argc, char* argv[]) {
- cxxopts::Options options("./uncompress",
- "Uncompresses files using Huffman Encoding");
- options.positional_help("./path_to_input_file ./path_to_output_file");
- bool isAsciiOutput = false;
- string inFileName, outFileName;
- options.allow_unrecognised_options().add_options()(
- "ascii", "Write output in ascii mode instead of bit stream",
- cxxopts::value<bool>(isAsciiOutput))(
- "input", "", cxxopts::value<string>(inFileName))(
- "output", "", cxxopts::value<string>(outFileName))(
- "h,help", "Print help and exit");
- options.parse_positional({"input", "output"});
- auto userOptions = options.parse(argc, argv);
- if (userOptions.count("help") || !FileUtils::isValidFile(inFileName) ||
- outFileName.empty()) {
- cout << options.help({""}) << std::endl;
- exit(0);
- }
- // check empty input
- if (FileUtils::isEmptyFile(inFileName)) {
- ofstream output(outFileName);
- } else { // handle decompressing
- if (isAsciiOutput) {
- pseudoDecompression(inFileName, outFileName);
- } else {
- trueDecompression(inFileName, outFileName);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement