Cod sursa(job #1360531)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 25 februarie 2015 15:56:00
Problema Convertor Scor 60
Compilator c Status done
Runda rosedu_cdl_2015 Marime 3.41 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>



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
	
	char *no_spaces;//e un element ce are toate etributele elementului
	//no spaces va fi returnat
	
		 
		
		//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;
		char aux[3000];//la sfarsit vom trece intr-un alt vector , alocat dinamic , ce va fi returnat
		for(i=0;i<strlen(element);i++){
			if(ghm%2==0 && isspace(element[i]))
				continue;
			
			aux[j]=element[i];
			j++;
			if(element[i]=='\"')
				ghm++;

		}
		
		aux[j]='\0';
		
		no_spaces=strdup(aux);//alocam spatiu pt no spaces;
		return no_spaces;


}
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 tmp[2000];
	char first[1000];//in el retinem prima linie , cea cu categoriile
	char **categ;
	categ=(char**)malloc(20*sizeof(char*));


	if (in==NULL){
		fprintf(stderr, "err\n");
		exit(1);
	}








		char s[1025];
		char fin[3000],c=' ';
		int i;
		//OBTINEM CATEGORIILE
		i=0;
	while(c!='}'){
		c=fgetc(in);
		fin[i]=c;
		i++;
	}
	fin[i]='\0';
	//puts(fin);
	

	fclose(in);
	in=fopen("convertor.in","r");
	
		

	//
	char *p,*q;
		//separam primul element din json , cu toate atributele sale
		p=strchr(fin,'{');
		q=strchr(fin,'}');
		i=0;
		while(p<=q){
			
			tmp[i]=*p;
			i++;
			p++;
		}
		tmp[i]='\n';
		
		

				char *a;
				a=strtok(tmp,",:");
				 i=0;
				while(a!=NULL){
					if(i%2==0){
							
						strcat(first,a);
					}
					a=strtok(NULL,",:");
					i++;
				}

				char *b;
				char tst[]=" ";
				b=tst;
				a=strchr(first,'"');
				
				int n=0 ;
				
				char aux[1000];
				while(a!=NULL && b!=NULL){
						b=strchr(a+1,'"');

					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");

		strcpy(fin,"");//eliberam vectorul ce contine primul elem pt a putea fi folosit in ocntinuare		

		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);
				fin[i]=c;
				i++;
			}
			fin[i]='\0';
			//puts(fin);
			//acum prelucram noul element extras
			char *no_spaces;
			no_spaces=element(fin);
			write(no_spaces,out);
			




		}
	}	
			

	/*
	//in continuare incerc sa scot cuvintele dintre ghilimele si sa le pun in vector cu ctg




		
		a=strchr(fin,'{');
		b=strchr(fin,'}');
		char *no_spaces;
		
		while(a!=NULL && b!=NULL){
			
			no_spaces=element(a,b);
		
		
			write(no_spaces,out);
			
			
			a=strchr(b,'{');
			
			if(a!=NULL)
				b=strchr(a,'}');
			else
				break;

		}
		

		
		*/

	fclose(out);
	fclose(in);
	
	return 0;
		

}