Pagini recente » Cod sursa (job #2121345) | Cod sursa (job #707117) | Cod sursa (job #1433270) | Cod sursa (job #710397) | Cod sursa (job #1362712)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
FILE *f,*g;
int main()
{ f=fopen("convertor.in","r");
g=fopen("convertor.out","w");
//dim1 dimensiunea buffer1 - coada pentru chei
//dim dimensiunea buffer - coada pentru valori
int dim=-1,dim1=-1,i;
//glm contor de stare - (-1) => caracterul este inafara cheii; (1) => caracterul este in cheie
//dpv contor de stare - (1) => nu sunt in zona valorii de dupa cheie; (-1) sunt acolo si verific ce caractere am
//once contor de frecventa => imi zice daca am citit cheile odata
//ok contor de pozitie => daca sunt in afara secventei din {} ok==0 astfel ok!=0
char c,glm=-1,dpv=1,once=1,ok=0;
char buffer[1024],buffer1[1024];
while(fscanf(f,"%c",&c)!=EOF)
{ if(c=='"')glm*=-1;//schimb starea => zic ca sunt in cheie
if((glm==1)&&(once)&&(dpv==1)&&(c!='"'))buffer1[++dim1]=c;//pun caracterele din cheie in buffer
if((once)&&(c==':')&&(glm==-1))buffer1[++dim1]=',';//am iesit din cheie si pun o (,) in buffer
if((c==':')&&(glm==-1))dpv*=-1;//schimb starea => zic ca sunt in zona de valori de dupa cheie
if((dpv==-1)&&(isdigit(c)||(glm==1))&&(c!='"'))buffer[++dim]=c;//verific daca caracterul este numar sau litera, si-l pun in buffer sau il ignor
else if((dpv==-1)&&((c==',')||(c=='}')))buffer[++dim]=',';//pun virgula de la sfarsit dupa fiecare valoare
if(c=='}'){dpv*=-1;ok=0;}//schimb starea => zic ca nu sunt in zona de valori de dupa cheie si am terminat linia
else if(c=='{')ok++;//zic ca am inceput linia
else if((ok)&&(c==','))dpv*=-1;//schimb starea => zic ca sunt in zona de valori de dupa cheie si am inceput linia
if((c=='}')&&(once)){ for(i=0;i<=dim1;i++)fprintf(g,"%c",buffer1[i]);
fprintf(g,"\n");//afisiez caracterele din buffer cand sunt la capatul liniei
dim1=-1;
once=0;
}
if((c==']')||(c=='}')){for(i=0;i<=dim;i++)fprintf(g,"%c",buffer[i]);
fprintf(g,"\n");//afisiez caracterele din buffer cand sunt la capatul liniei
dim=-1;
}
}
return 0;
}