samedi 24 octobre 2020

How to use ofstream in this certain methodology

I believe the code here is correct. It does behave mostly as expected. But unfortunately, it will not write to file. I do not understand why, though. There isn't a reason for it to skip this step. I am wondering where I have missed in my syntax. If anyone can show me the reason, I'd be most appreciative. I love this site. BTW, this is compression.

#include <fstream>
#include <iostream>
#include <bitset>
#include <vector>
#include <sstream>
#include <string.h>
#include <chrono>
#include <cmath>

using namespace std;

const uint64_t MAX_SEG_CNT = 1000000;

int main(int argc, char **argv)
{

    string ghost = "", boo = "", agh = "";
    stringstream fd;
    ifstream fin(argv[2]);
    if (!fin)
        exit(0);
    ofstream fout(argv[3], std::ios_base::out | std::ios_base::binary);
    if (!fout)
        exit(0);
    fd << fin.rdbuf();
    ghost = fd.str();
    fd.str("");

    uint64_t file_size = ghost.length();

    auto start = std::chrono::system_clock::now();
    // Start Timer
    std::time_t start_time = std::chrono::system_clock::to_time_t(start);
    cout << std::ctime(&start_time) << flush;

    cout << "Compressing file... (this could be awhile)" << flush;
    size_t fg = 0;
    // Iterator count through file
    uint64_t H = 0, G = 0;
    bool p = 0;
    uint64_t PERCENT = 0, PER_FIX = 0, OGRE = 0, FIEND = 0, OUTPUT_BYTE_CNT = 0;
    agh = ghost;
    if (ghost.length() > MAX_SEG_CNT)
        ghost = ghost.substr(0, MAX_SEG_CNT % ghost.length());
    bitset<64> total = 0 /* iterates file */, pumpkinbomb = 0 /* compressed cypher */;
    if (strcmp(argv[1], "-c") == 0)
    {
        uint8_t zombie = 0;
        string skeleton = "";
        while (ghost.length() > 0)
        {
            uint8_t i = 0;
            string temp_ghost = (ghost.length() >= 8) ? ghost.substr(0, 8) : ghost;
            for (uint8_t y : temp_ghost)
            {
                total = total.to_ullong() + (y << (i * 8));
                i++;
            }

            FIEND = OGRE;
            
            // Count number of tiers in our pyramid
            // Cut total to 4 bits long
            // via our algorithm of linear XOR
            while (total.to_ullong() >= 1)
            {
                // MAX_STEPS_INT is the amount of rows
                // to let pass by before making another
                // point of entry to the pyramid of numbers.
                pumpkinbomb = total[0] + (pumpkinbomb.to_ullong() << 1);
                OGRE++;
                uint8_t f = 0;
                uint64_t bats = 0;
                while (total.to_ullong() >= 2)
                {
                    bats += ((total[0] ^ total[1]) << f);
                    total >>= 1;
                    f++;
                }
                total = bats;
                if ((total.to_ullong() >> 1) <= 1)
                    break;
            }
            skeleton.push_back((char)(OGRE - FIEND));
            if (OGRE > 62)
                cout << "." << flush;
            zombie += OGRE;
            while (zombie > 50 && pumpkinbomb.to_ullong() > 0)
            {
                uint8_t x = pumpkinbomb.to_ullong() % 256;
                (x == 0) ? boo.push_back('\0') : boo.push_back((char)(x));
                pumpkinbomb >>= 8;
            }
            if (boo.length() > 0)
            {
                boo = skeleton + '$' + boo;
                boo.insert(boo.begin(),'&');
                OUTPUT_BYTE_CNT += boo.length();
                fout << boo;
                boo.clear();
                skeleton.clear();
                zombie = OGRE = 0;
            }
            if (ghost.length() <= 8 && agh.length() == 0)
                break;
            if (ghost.length() <= 8 && agh.length() >= MAX_SEG_CNT)
            {
                ghost = agh.substr(0, MAX_SEG_CNT);
                agh = agh.substr(MAX_SEG_CNT);
            }
            else if (ghost.length() <= 8 && agh.length() < MAX_SEG_CNT)
            {
                ghost = agh;
                agh.clear();
            }
            ghost = ghost.substr(temp_ghost.length());
            H++;
            if (PER_FIX < 99 && p == 0 && agh.length() + 1 < file_size - ((file_size / 100) * PER_FIX))
            {
                while (PERCENT < 99 && (file_size / 100) * PERCENT < (file_size - agh.length()))
                    PERCENT++;
                PER_FIX = PERCENT;
                double PRCNT = (double)((OUTPUT_BYTE_CNT) / ((double)(file_size - agh.length())));
                
                cout << (PER_FIX) << "/" << round(PRCNT * 100) << "% .." << flush;
                p = 1;
            }
            else if (p)
            {
                p = 0;
            }
        }
        while (pumpkinbomb.to_ullong() > 0)
        {
            uint8_t x = pumpkinbomb.to_ullong() % 256;
            (x == 0) ? boo.push_back('\0') : boo.push_back((char)(x));
            pumpkinbomb >>= 8;
        }
        if (boo.length() > 0)
        {
            boo = skeleton + '$' + boo;
            boo.insert(boo.begin(),'&');
            OUTPUT_BYTE_CNT += boo.length();
            fout << boo;
            boo.clear();
            skeleton.clear();
        }
        
    }
    else if (strcmp(argv[1], "-d") == 0)
    {
        do
        {
            vector<uint64_t> hobo {};
            string skeleton = ghost.substr(1,ghost.find("$",1));
            string boo_ghost = ghost.substr(ghost.find("&",skeleton.length()));
            if (ghost.find("&",skeleton.length()) == std::string::npos)
                ghost.clear();
            else
                ghost = ghost.substr(1 /*&*/ + skeleton.length() + 1 /*$*/ + boo_ghost.length());

            bitset<64> troll = 0;
            for (uint8_t x : boo_ghost)
            {
                troll = troll.to_ullong() + x;
            }
            
            for (int i = 0 ; i < skeleton.length() ; i++)
            {
                uint8_t bones = (int)(skeleton[i]);
                bool clown = troll[(int)(skeleton[i]) - bones];
                uint64_t house = (int)(clown);
                bitset<64> ghoulish = (int)troll[0];
                while (bones > 0)
                {
                    house <<= 1;
                    house += (int)(clown);
                    uint8_t j = (int)(skeleton[i]) - bones, h = 0;
                    while (h < j)
                    {
                        clown = ghoulish[h] ^ clown;
                        house <<= 1;
                        house += (int)(clown);
                        h++;
                    }
                    ghoulish = house;
                    bones--;
                    clown = troll[(int)(skeleton[i]) - bones];
                }
                hobo.push_back(house);
            }
            for (uint64_t x : hobo)
            {
                uint64_t y = x;
                string t = "";
                while (y > 0)
                {
                    uint8_t v = y%256;
                    t.push_back((char)(v));
                    y >>= 8;
                }
                // Works now!
                fout << t;
            }
        } while (ghost.find("&") != std::string::npos);
    }
    // End process
    auto end = std::chrono::system_clock::now();
    std::chrono::duration<double> elapsed_seconds = end - start;
    std::time_t end_time = std::chrono::system_clock::to_time_t(end);

    std::cout << "\nfinished computation at " << std::ctime(&end_time)
              << "elapsed time: " << elapsed_seconds.count() << "s\n";
    cout << "done." << endl
         << flush;

    exit(0);
}

Aucun commentaire:

Enregistrer un commentaire