Cod sursa(job #1361008)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 25 februarie 2015 19:08:30
Problema Convertor Scor 70
Compilator c Status done
Runda rosedu_cdl_2015 Marime 4.58 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(){
    FILE *in=fopen("convertor.in","r");
    FILE *out=fopen("convertor.out","w");
     
    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));
 
 
    if (in==NULL){
        fprintf(stderr, "err\n");
        exit(1);
    }
 
        //char s[1025];
 
        int i;
        //OBTINEM CATEGORIILE
        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);
    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;
                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;
         
 }