Cod sursa(job #1348905)

Utilizator PatrunjelFMIAnita Liviu Patrunjel Data 19 februarie 2015 21:42:28
Problema Convertor Scor 80
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 2.95 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>

const int KEYLEN = 1000;
const int VALLEN = 1000;
const int OB1_PAIR_CNT = 1000;

int main(){
	FILE* f_in = fopen("convertor.in","r");
	FILE* f_out = fopen("convertor.out","w");

	char OB1_Val_Buf[OB1_PAIR_CNT][VALLEN];
	char Val_Buf[VALLEN];
	char Index_Buf[KEYLEN];
	unsigned c;

	int i,j;

	/**
	 * Primul obiect
	 * Scot numele coloanelor & 
	 * Valorile corespunzatoare
	 **/
	
	fscanf(f_in," [ { ");

	i=0;
	while( (c=getc(f_in)) != '}'){
		ungetc(c,f_in);	//nu ma bag, man

		//index
		if( (c=getc(f_in)) != '\"'){
			//numar
			ungetc(c,f_in);
			fscanf(f_in," %[^:]",Index_Buf);
			getc(f_in);	//:
			fscanf(f_in," ");

		}
		else{
			//string
			fscanf(f_in," %[^\"]",Index_Buf);
			getc(f_in);	// "
			fscanf(f_in," ");
			getc(f_in); // :
			fscanf(f_in," ");
		}

		fprintf(f_out,"%s,",Index_Buf);

		//val
		c = getc(f_in);
		if( c != '\"'){
			//numar
			while(c>'z') c = getc(f_in);	//ciudat; uneori pune in c 223U;  FIXME
			ungetc(c,f_in);
			fscanf(f_in," %[^},]",OB1_Val_Buf[i]);
			
			fscanf(f_in," ");
			c = getc(f_in);
			if( c != ','){	// posibil }
				for(int j=0;OB1_Val_Buf[i][j]!='\0';j++)
					if(OB1_Val_Buf[i][j] == '\n')
						OB1_Val_Buf[i][j] = '\0';

		
				ungetc(c,f_in);
				break;
			}
			fscanf(f_in," ");
		}
		else{
			//string
			fscanf(f_in," %[^\"] ",OB1_Val_Buf[i]);
			getc(f_in);	//"
			fscanf(f_in," ");
			c = getc(f_in);
			if( c !=',') {	//posibil }
				ungetc(c,f_in);
				break;
			}
			fscanf(f_in," ");
		}
		i++;
		
	}
	fprintf(f_out,"\n");

	//scriu si valorile din primul obiect
	for(j=0;j<=i;j++)
		fprintf(f_out,"%s,",OB1_Val_Buf[j]);
	fprintf(f_out,"\n");

	/*****
	 * Restul obiectelor; Ignor cheia
	 *****/

i=0;

	fscanf(f_in," ");
///	Intru OK	
	while( (c=getc(f_in)) != ']'){	//, sau ]
		fscanf(f_in," ");
		getc(f_in);	// {
		fscanf(f_in, " ");
	
		c=getc(f_in);
		while( c != '}'){
				ungetc(c,f_in);
				//index;ignor
				fscanf(f_in, " %[^:] ",Index_Buf);
				getc(f_in);	//:
				fscanf(f_in," ");

				//Val
				for(c=getc(f_in); !isdigit(c) && c!='\"' ; c=getc(f_in));
				if( c != '\"'){
					//nr
					while(c > 'z') c = getc(f_in);// ciuat; uneori pune in c 223U (-30 printat ca int din tip char); EOF/overflow?FIXME
					ungetc(c,f_in);
					fscanf(f_in," %[^,}]",Val_Buf);
					fscanf(f_in," ");

					c=getc(f_in);
					if(c!=','){	//}

						for(i=0;Val_Buf[i]!='\0';i++)	//citeste si \n inainte de }
							if(Val_Buf[i] == '\n')
								Val_Buf[i]='\0';
						ungetc(c,f_in);
						fprintf(f_out,"%s,\n",Val_Buf);
						break;
					}
				}
				else{
					//str
					fscanf(f_in," ");
					fscanf(f_in," %[^\"]",Val_Buf);
					c = getc(f_in);	//"
					fscanf(f_in," ");
					
					c=getc(f_in);
					if(c !=','){	//posibil }
						ungetc(c,f_in);
						fprintf(f_out,"%s,\n",Val_Buf);	
						break;
					}
					fscanf(f_in," ");
				}
				fprintf(f_out,"%s,",Val_Buf);

				getc(f_in);
		}
		i++;
		fscanf(f_in," ");
		c = getc(f_in);	// }
		fscanf(f_in," ");
	}

	return 0;
}