Cod sursa(job #1355059)

Utilizator achirialexAlexandru Achiritoaei achirialex Data 22 februarie 2015 12:40:33
Problema Convertor Scor 60
Compilator c Status done
Runda rosedu_cdl_2015 Marime 3.57 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    FILE *fin = fopen("convertor.in", "r");
    FILE *fout = fopen("convertor.out", "w");
    char linie[1000000];
    memset(linie, 0, 1000000);
    char *auxiliar;
    int i, semHead = 0, contElem, lungime = 0;
    int counting = 0;
    char elements[1024][128];
    char aux;
    char *cuv = (char*)calloc(1000000, sizeof(char));
    char *sep = "\"";
    //Citire pana la terminarea fisierului
    while(fread(&aux, sizeof(char), 1, fin)){   // !feof ( fin ) ) {
    	//citim caracter cu caracter
//    	fread(&aux, sizeof(char), 1, fin); = fgetc(fin); sau //fgetcscanf(fin, "%c", &aux) != EOF;
    	//Incep sa retin o linie de JSON, care incepe cu '{' si se termina cu '}'
        if(aux == '{'){
            lungime = 0;
            counting = 1;
        }
        //Se adauga doar daca este informatie dintr-o linie JSON, si caracterul nu este newline
        if(aux != '\n' && counting == 1 ){
        	//Formatam astfel incat toate cheile sa fie intre " ", deoarece numerele nu sunt;
        	//
            if(isspace(aux) || aux < 0){
            	//Eleminam orice spatiul dintre ':' si valoarea cheii
                if(lungime > 0 && linie[lungime - 1] != ':' && linie[lungime - 1] != ',' && linie[lungime - 1] != '"' ){
                    linie[lungime] = aux;
                    lungime++;
                }
            }
            else{
            	//Daca dupa ':' nu avem ", adaugam;
                if(lungime > 0 && aux != '"' && linie[lungime - 1] == ':'){
                    linie[lungime] = '"';
                    lungime++;
                }
                //Daca inainte de ',' nu avem ", adaugam;
                if(lungime > 0 && aux == ',' && linie[lungime - 1] != '"'){
                    linie[lungime] = '"';
                    lungime++;
                }
                //Daca inainte de '}' nu avem ", adaugam
                if(lungime > 0 && aux == '}' && linie[lungime - 1] != '"'){
                    linie[lungime] = '"';
                    lungime++;
                }
                linie[lungime] = aux;
                lungime++;
            }
        }

        //Terminam de inregistrat linia, o prelucram;
        if(aux == '}' && counting == 1){
        	printf("%s\n", linie);
            contElem = 0;
            auxiliar = strdup(linie);//strcpy(auxiliar, linie);
            //Prelucram dupa separatorul "
//            sep = "\"";
            cuv = strtok(auxiliar, sep);
            while(cuv != NULL){
                strcpy(elements[contElem], cuv);
                contElem++;
                cuv = strtok(0, sep);
            }
//            cuv = (char*)calloc(1025, sizeof(char));
            //Afisam o singura data antetul de tabel;
            if(semHead == 0){
                for(i = 1; i < contElem - 1; i = i + 4)
                    fprintf(fout, "%s,", elements[i]);
                semHead = 1;
                fprintf(fout, "\n");
            }
            //Afisam valorile tabelului;(sunt din 4 in 4, daca dorim element, pornim de la al token 3(elements[3]), daca dorim cap de tabel, de la elem[1];
            for(i = 3; i < contElem; i = i + 4)
                fprintf(fout, "%s,", elements[i]);
            fprintf(fout, "\n");
            //Am prelucrat linia, cautam alta linie JSON;
            //Resetam contorul, lungimea linie, valorile din linie;
            lungime = 0;
            counting = 0;
//            printf("%s\n", linie);
            memset(linie, 0, 1025);
//    		printf("%c", aux);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}