Cod sursa(job #1347494)

Utilizator irinapatularuPatularu Irina irinapatularu Data 18 februarie 2015 23:35:06
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.91 kb
//PII
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main()
{
    FILE *f, *g;
    char *linie;
    int ct = 0, i = 0, ok = 0;
    //variabila ct este folosita pentru numerotarea aparitiilor ghilimelelor
    linie = (char *)calloc(1025, sizeof(char));
    f = freopen("convertor.in", "rb", stdin);
    g = freopen("convertor.out", "wb", stdout);
    //se va citi linie cu linie din fisierul de intrare
    while(fread(linie, sizeof(char *), 1, f) && ok == 0)
    {
        /*variabila ok este folosita pentru a opri prima structura repetitiva while
          chiar daca fisierul nu s-a terminat*/
        i = 0;
        while(linie[i] != '}' && i < strlen(linie))
        {
            if(linie[i] == '\"')
            {
                ct++;
            }
            else
            {
                /*se va parcurge o bucata din fisierul de intrare pentru a
                  scrie in cel de iesire mai intai cheile*/
                if(ct == 1)
                {
                    fwrite(&linie[i], 1, sizeof(char), g);
                }
                else
                    if(linie[i] == ',')
                    {
                        /*daca s-a intalnit virgula, s-a citit deja o pereche
                         de forma cheie-valoare*/
                        fwrite(&linie[i], 1, sizeof(char), g);
                        ct = 0;
                    }
            }
        i++;
        }
        /*se marcheaza prin variabila ok faptul ca s-au citit toate
        cheile existente*/
        if(i < strlen(linie))
            ok = 1;
    }
    fprintf(g, "%c\n", ',');
    //se muta pointerul asociat fisierului de intrare la inceputul acestuia
    fseek(f, 0, SEEK_SET);
    ct = 0;
    ok = 0;
    /*se realizeaza aceeasi parcurgere a fisierului ca cea anterioara
    dar se ignora cheile si se afiseaza doar valorile*/
    while(fread(linie, 1, sizeof(char *), f) && ok == 0)
    {
        i = 0;
        while(linie[i] != ']' && i < strlen(linie))
        {
            if(linie[i] == '\"')
                ct++;
            else
            {
                if(linie[i] == ',' && ct)
                {
                    ct = 0;
                    fwrite(&linie[i], 1, sizeof(char), g);
                }
                if(linie[i] == '}')
                {
                    fprintf(g, "%c\n", ',');
                    ct = 0;
                }
                //pentru ct fie 2 fie 3, inseamna ca ne situam pe o valoare
                if(ct == 2)
                    if(linie[i] <= '9' && linie[i] >= '0')
                        fwrite(&linie[i],1,sizeof(char),g);
                if(ct == 3)
                    fwrite(&linie[i], 1, sizeof(char), g);
            }
            i++;
        }
        if(i < strlen(linie))
            ok = 1;
    }

    fclose(g);
    fclose(f);
    free(linie);
    return 0;
}