Cod sursa(job #1347889)

Utilizator relu.draganDragan Relu relu.dragan Data 19 februarie 2015 12:32:41
Problema Convertor Scor 100
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 3.95 kb
#include <fstream>
#include <string>
using namespace std;

class MyConverter
{

    ifstream f;
    ofstream g;
    const int MAXSIZE;
    char* buffer;

    bool isDigit(char c);
    void add_value(int &poz, char &c);
    void print_value();

public:
    
    MyConverter(const char* in_name, const char* out_name);
    void Initialize();
    int first_keyvalues();
    void next_values();
    void print_firstvalues();
    ~MyConverter();

};

bool MyConverter::isDigit(char c)
{
    if ((int)c >= 48 && (int)c <= 57)
        return true;
    else
        return false;
}

void MyConverter::add_value(int &poz, char &c)
{

    //adauga o valoare in buffer
    //presupunem ca ne aflam pe pozitia caracterului :

    while (1)
    {
        f.get(c);
        if (c == '"')
        {
            //value is string
            f.get(c);
            do
            {
                buffer[poz++] = c;
                f.get(c);
            }
            while (c != '"');
            buffer[poz++] = ',';
            break;
         }
         else
             if (isDigit(c))
             {
                 //value is number
                 while (isDigit(c))
                 {
                     buffer[poz++] = c;
                     f.get(c);
                 }
                 buffer[poz++] = ',';
                 break;
             }
    }
}

void MyConverter::print_value()
{

    //presupunem ca ne aflam pe pozitia caracterului :

    char c;
    while (1)
    {
        f.get(c);
        if (c == '"')
        {
            //value is string
            f.get(c);
            do
            {
                g << c;
                f.get(c);
            }
            while (c != '"');
            g << ",";
            break;
        }
        else
            if (isDigit(c))
            {
                //value is number
                while (isDigit(c))
                {
                    g << c;
                    f.get(c);
                }
                g << ",";
                break;
            }
    }
}

MyConverter::MyConverter(const char* in_name, const char* out_name) : MAXSIZE(600000)
{
    f.open(in_name);
    g.open(out_name);
}

void MyConverter::Initialize()
{
    buffer = new char[MAXSIZE];
}

int MyConverter::first_keyvalues()
{

    //parcurge fisierul pana la intalnirea caracterului }
    //memoreaza valorile in buffer
    //afiseaza cheile

    int poz = 0;
    char c;

    //first key
    f.get(c);
    while (c != '"')
        f.get(c);
    f.get(c);
    while (c != '"')
    {
        g << c;
        f.get(c);
    }
    g << ",";

    //first value
    f.get(c);
    while (c != ':')
        f.get(c);
    add_value(poz, c);
    
    //next key/values
    while (c != '}')
    {
        //key
        while (c != ',')
        {
            //check to see if the last key has been printed 
            if (c == '}')
            {
                buffer[poz] = '\0';
                g << endl;
                return 1;
            }
            f.get(c);
        }
        f.get(c);
        while (c != '"')
            f.get(c);
        f.get(c);
        while (c != '"')
        {
            g << c;
            f.get(c);
        }
        g << ",";

        //value
        f.get(c);
        while (c != ':')
            f.get(c);
        add_value(poz, c);
    }
    buffer[poz] = '\0';
    g << endl;
    return 1;
}

void MyConverter::next_values()
{

    //afiseaza valorile dupa primul caracter }, randurile 3+ la output

    char c;
    f.get(c);
    while (c != ']')
    {
        if (c == ':')
        {
            print_value();
        }
        if (c == '{')
            g << endl;
        f.get(c);
    }
}

void MyConverter::print_firstvalues()
{
    g << buffer;
}

MyConverter::~MyConverter()
{
    delete(buffer); 
    f.close();
    g.close();
}

int main(void)
{
    {
        MyConverter C("convertor.in", "convertor.out");
        C.Initialize();
        C.first_keyvalues();
        C.print_firstvalues();
        C.next_values();
    }
    return 0;
}