Cod sursa(job #1342668)

Utilizator relu.draganDragan Relu relu.dragan Data 14 februarie 2015 13:32:57
Problema Convertor Scor 0
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.44 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXKEYLENGTH 250
#define MAXNRVALUES 60000
#define MAXVALUELENGTH 250
int isDigit(char c)
{
  if ((int)c >= 48 && (int)c <= 57)
    return 1;
  else 
    return 0;
}

void print_value(FILE* f, FILE* g)
{
  //presupunem ca suntem pe pozitia caracterului :
  char c;
  //fseek(f, dotpos + 1, SEEK_SET);
  while (1)
  {
    c = getc(f);

    if (c == '"')
    {
      //string
      c = getc(f);
      do
      {
        fprintf(g, "%c", c);
        c = getc(f);
      }
      while (c != '"');
      fprintf(g, ", ");
      break;
    }
    else
      if (isDigit(c))
      {
        //number
        while (isDigit(c))
        {
          
          fprintf(g, "%c", c);
          c = getc(f);
        } 
        fprintf(g, ", ");
        break;
      }
  }
}  
void print_key(FILE* f, FILE* g)
{
  //presupunem ca ne aflam pe pozitia caracterului :
  int i = 1, dotpos;
  char c;
  dotpos = ftell(f);
  fseek(f, dotpos-1, SEEK_SET);
  c = getc(f);
  //gaseste primele ghilimele (cele care inchid key-ul)
  while (c != '"')
    {
      i++;
      fseek(f, dotpos-i, SEEK_SET);
      c = getc(f);
    }

  i++;
  fseek(f, dotpos-i, SEEK_SET);
  c = getc(f);

  //gaseste cel de-al doilea caracter ghilimele (cele care deschid key-ul)
  while (c != '"')
  {
    i++;
    fseek(f, dotpos-i, SEEK_SET);
    c = getc(f); 
  }

  //afiseaza key-ul
  c = getc(f);
  
  while (c != '"')
  {
    fprintf(g, "%c", c);
    
    c = getc(f);
  }
  fprintf(g, ", ");

}
void get_dots_positions(FILE* f, FILE* g, int pos)
{
  char c;
  long int currpos, currvaluenr = 0;
  fseek(f, pos, SEEK_SET);
  int nr_keys = 0;
  do
  {
    c = getc(f);
    if (c == ':')
    {
      nr_keys++;
      currpos = ftell(f);
      print_key(f,g);
      fseek(f, currpos + 1 , SEEK_SET);
    }
  }
  while (c != '}');
  fprintf(g, "\n");
  fseek(f, pos, SEEK_SET);
  do
  {
    c = getc(f);
    if (c == ':')
    {
      currvaluenr++;
      currpos = ftell(f);
      print_value(f,g);
      fseek(f, currpos + 1, SEEK_SET);
      if (currvaluenr % 4 == 0)
        fprintf(g, "\n");
    }
  }
  while (c != ']');
}

int main(void)
{
    FILE *f, *g;
    
       
   // start = clock();
    
    f = fopen("convertor.in", "rt");
    g = fopen("convertor.out", "wt");
    
    get_dots_positions(f,g,0);
    
    fclose(f);
    fclose(g);
    //stop = clock();
    //printf("%.6f\n", (double)(stop - start) / CLOCKS_PER_SEC);
    return 0;
    
}