Cod sursa(job #1361036)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 25 februarie 2015 19:17:53
Problema Convertor Scor 70
Compilator c Status done
Runda rosedu_cdl_2015 Marime 4.26 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define DIM 3000
 
 
void strdel(char *p, int n){
    char *a;
    a=p+n;
    strcpy(p,a);
    p[strlen(p)]='\0';
 
}
char * element(char *element){//returneaza elementul dintre adresa a si b fara spatii in afara ghilimelelor

        //elinam spatiile idn afara ghilimelelor

        int ghm;//verificam daca avem nr par sau impar de ghilimele
                //daca e par eliminam spatiile 
                //daca e impar le lasam in pace
        ghm=0;
         int j=0,i,naux=1;
 
        char *aux;//la sfarsit vom trece intr-un alt vector , alocat dinamic , ce va fi returnat
        aux=(char*)malloc(naux*DIM*sizeof(char));
 
        for(i=0;i<strlen(element);i++){
            if(ghm%2==0 && isspace(element[i]))
                continue;
            if(strlen(aux)+1==naux*DIM){
                naux++;
                aux=(char*)realloc(aux,naux*DIM*sizeof(char));
            }
            aux[j]=element[i];
            j++;
            if(element[i]=='\"')
                ghm++;
 
        }
         
        aux[j]='\0';
   
        return aux;
 
 
}
void write(char *s,FILE *f){//s -> elementul din care extragem atributele , n , nr de atribute , f fisierul in care scriem
    int i , j;
    char *a;
    a=strchr(s,':');
 
        while(a!=NULL ){
         
            a=a+1;
            j=0;
     
            while(a[j]!=',' && a[j] !='}'){
                if(a[j]=='\"'){
                    j++;
                    continue;
                }
             
                fputc(a[j],f);
                j++;
            }
            fputc(',',f);
 
            a=strchr(a,':');
 
        }
        fputc('\n',f);
}       
 
int main(){
   
     
    char *first;//in el retinem  categoriile , astfel incat sa le putem scrie in fisier
    int nfirst=1;
    char **categ;
    char *fin,c=' ';//va fi un vector ce il vom folosi pt a citi element cu element 
    int nfin=1;
    categ=(char**)malloc(200*sizeof(char*));//in el tinem minte categoriile
    first=(char*)malloc(nfirst*DIM*sizeof(char));
    fin=(char*)malloc(nfin*DIM*sizeof(char));


        int i;
        //OBTINEM CATEGORIILE
        //deschidem fisierul din care citim
         FILE *in=fopen("convertor.in","r");
    
        i=0;
    while(c!='}'){
        c=fgetc(in);
        if(strlen(fin)+1==nfin*DIM){//in cazul in care lungimea sirului e mai mare decat nfin*dim , realocam
            nfin++;
            fin=(char*)realloc(fin,nfin*DIM*sizeof(char));
        }
        fin[i]=c;
        i++;
    }
    fin[i]='\0';
             
     
    fclose(in);//facem acest lucru pentru a reveni cursorul la inceputul fisierului
    in=fopen("convertor.in","r");
     
 
    char *a;
    a=strtok(fin,",:");
     i=0;
    while(a!=NULL){

        if(i%2==0){
                 
            strcat(first,a);
        }
        a=strtok(NULL,",:");
        i++;
    }
 
    char *b;
    char tst[]=" ";
    b=tst;//am facut asta pentru a putea intra in while(!=NULL)
    a=strchr(first,'"');
     
    int n=0 ;
                 
    char *aux;
    //deschidem fisierul in care vom scrie
    FILE *out=fopen("convertor.out","w");
    while(a!=NULL && b!=NULL){
            b=strchr(a+1,'"');
            aux=(char*)malloc((b-a)*sizeof(char));
 
        strncpy(aux,a+1, (int)(b-a-1));
        aux[b-a-1]='\0';
                     
        categ[n]=strdup(aux);
 
        fprintf(out,"%s,",categ[n]);
        n++;
        a=strchr(b+1,'"');
    }
    fprintf(out,"\n");
      
    c=' ';//pur si simplu e initializat ai sa poata intra in while
 
    while(c!=EOF){
        strcpy(fin,"");//eliberam vectorul ce urmeaza a fi prelucrat
        c=fgetc(in);
        if(c=='{'){
            i=0;
            while(c!='}'){
                c=fgetc(in);
                if(strlen(fin)+1==nfin*DIM){//in cazul in care lungimea sirului e mai mare decat nfin*dim , realocam
                    nfin++;
                    fin=(char*)realloc(fin,nfin*DIM*sizeof(char));
                }
                fin[i]=c;
                i++;
            }
            fin[i]='\0';
             
            char *no_spaces;
            no_spaces=element(fin);
            write(no_spaces,out);
            free(no_spaces);
 
        }
    }   
 
    fclose(out);
    fclose(in);
     
    return 0;
         
 }