Cod sursa(job #1357263)

Utilizator FiliutaMariusFMI Filiuta Marius FiliutaMarius Data 23 februarie 2015 20:47:08
Problema Convertor Scor 100
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 2.95 kb
#include<fstream>
#include<string>
using namespace std;
int main ()
{
    // Fisiere Intrare/Iesire
    ifstream in("convertor.in");
    ofstream out("convertor.out");


    string str_linie,obiect;
    size_t end_obiect;

    // Citire primul Obiect
    while(getline(in,str_linie) && str_linie.find('}')==string::npos)
    {
        obiect.append(str_linie);
    }
    obiect.append(str_linie);
    end_obiect=obiect.find('}');

    if(obiect.empty())
    {
        in.close();
        out.close();
        return 0;
    }

    // Extragerea tuturor cheilor
    for(size_t it=obiect.find(':'); it<end_obiect && it!=string::npos; it=obiect.find(':',it+1))
    {
        string cheie;
        size_t k,ends=it; // Delimitatori
        bool exists=false; // Prima aparitie a ghilimelelor ( de la dreapta )

        //Aflarea delimitarii cheii de ghilimele
        for(k=it ;; k--)
        {
            if(!exists && obiect[k]=='"')
            {
                ends=k;
                exists=true;
            }
            else
            if(obiect[k]=='"')
                break;
        }

        cheie=obiect.substr(k+1,ends-k-1);
        out<<cheie<<',';
    }

    out<<'\n';

    // Extragerea valorilor ptr toate obiectele ( fiecare iteratie reprezentand urmatorul obiect )
    while(true)
    {

        end_obiect=obiect.find('}');
        for(size_t it=obiect.find(':'); it<end_obiect && it!=string::npos; it=obiect.find(':',it+1))
        {
            string camp;
            size_t k=it+1,beg; // Delimitatori
            bool exists=false; // Prima aparitie a ghilimelor de la stanga ( daca exista )

            while(obiect[k]==' ') // Eliminare Spatii in plus
                k++;

            beg=k-1; // In cazul in care campul este numar

            //Delimitare Camp aflat intre ghilimele pentru sir si intre alte caractere non-numerice pentru numar
            while(k)
            {
                if(!exists && obiect[k]=='"')
                {
                    beg=k;
                    exists=true;
                }
                else
                if((!exists && (obiect[k]==' ' || obiect[k]==',' || obiect[k]=='}')) || obiect[k]=='"')
                    break;
                k++;
            }

            camp=obiect.substr(beg+1,k-beg-1);
            out<<camp<<',';
        }
        out<<'\n';

        obiect=obiect.substr(end_obiect+1); // Elimina obiectul deja analizat

        // Citire urmatorul Obiect daca este cazul
        if(obiect.find(']')==string::npos)
        {
            while(getline(in,str_linie) && str_linie.find('}')==string::npos)
            {
                obiect.append(str_linie);
            }
            obiect.append(str_linie);
        }
        else
            if(obiect.find('}')==string::npos) // Daca nu mai exista niciun obiect in linie
                break;
    }

    in.close();
    out.close();
    return 0;
}