Pagini recente » Cod sursa (job #377593) | Cod sursa (job #893295) | Cod sursa (job #2257773) | Cod sursa (job #1504575) | Cod sursa (job #1361352)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define cifre "0123456789"
char* seek_char(char* p, char ch)
{
do {
p++;
} while(*p != ch && *p != '\0');
return p;
}
char* seek_nonwsp(char* p) {
while(*p == ' ' || *p == '\n') {
p++;
}
return p;
}
int main()
{
FILE* f = fopen("convertor.in","rt");
FILE* g = fopen("convertor.out","wt");
//aflam dimensiune fisierului
fseek(f, 0, SEEK_END);
long int size = ftell(f);
rewind(f);
//citim fisierul JSON
char* string = malloc(sizeof(char) * size + 1);
fread(string, sizeof(char), size, f);
char* beg = string;
//parsare primul obiect pentru a gasi si afisa cheile intalnite
char* obj_end = seek_char(string, '}');
while(string < obj_end) {
string = seek_char(string, '\"');
string++;
while(*string != '\"') {
fprintf(g, "%c", *string);
string++;
}
fprintf(g, ",");
string = seek_char(string, ',');
}
//parsarea tuturor obiectelor pentru a gasi si afisa valoarea fiecarei chei
string = beg;
while(string < beg + size) {
//cautam punctele de inceput si sfarist pentru obiectul curent
string = seek_char(string, '{');
if(*string == '\0') {
break;
}
obj_end = seek_char(string, '}');
fprintf(g, "\n");
//gasim si afisam valoarea fiecarei chei
while(string < obj_end) {
//cautam primul caracter non-whitespace de dupa ':'
//verificam daca e string sau numar si afisam corespunzator
string = seek_char(string, ':');
string++;
string = seek_nonwsp(string);
if(*string == '\"') {
string++;
while(*string != '\"') {
fprintf(g, "%c", *string);
string++;
}
} else {
//afisam toate cifrele(caractere) de la pozitia curenta in string
while(strchr(cifre, *string)) {
fprintf(g, "%c", *string);
string++;
}
}
//trecem la urmatorul element
fprintf(g, ",");
string = seek_char(string - 1, ',');
}
//am depasit obiectul prelucrat, asa ca ne intoarcem la sfarsitul lui
string = obj_end;
}
}