#include #include #include #include #include #include "huffman.hpp" std::vector read_file(char *filename) { std::ifstream input_file{ filename, std::ios::binary | std::ios::in }; input_file.exceptions(std::ios::badbit | std::ios::failbit); return std::vector{ std::istreambuf_iterator(input_file), {} }; } enum class direction { compress, decompress }; int show_usage() { std::cerr << "Usage: huffman (compress|decompress) input_file output_file." << std::endl; return 1; } int main(int argc, char **argv) { direction operation; if (argc != 4) { return show_usage(); } if (std::strcmp(argv[1], "compress") == 0) { operation = direction::compress; } else if (std::strcmp(argv[1], "decompress") == 0) { operation = direction::decompress; } else { return show_usage(); } std::vector input; try { input = read_file(argv[2]); } catch (std::iostream::failure& exception) { std::cerr << "Error opening file \"" << argv[2] << "\" for reading." << std::endl; return 2; } std::ofstream output_file{ argv[3], std::ios::binary | std::ios::out | std::ios::trunc }; output_file.exceptions(std::ios::badbit | std::ios::failbit); switch (operation) { case direction::compress: compress(input, output_file); break; case direction::decompress: decompress(input, output_file); break; } return 0; }