Cod sursa(job #1343067)

Utilizator relu.draganDragan Relu relu.dragan Data 14 februarie 2015 20:44:30
Problema Convertor Scor 90
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.33 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int isDigit(char c)
{
  if ((int)c >= 48 && (int)c <= 57)
    return 1;
  else 
    return 0;
}
int get_nrkeys (FILE* f)
{

  int nr_keys = 0;
  char c = 0;
  fseek(f, 0, SEEK_SET);
  c = getc(f);
  while (c != '}')
  {
    if (c == ':')
      nr_keys++;
    c = getc(f);
  }
  return nr_keys;
}
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 afisare_chei(FILE* f, FILE* g)
{
  fseek(f, 0, SEEK_SET);
  //afisare prima cheie
  char c;
  int flag = 0;
  c = getc(f);
  while (c!='"')
    c = getc(f);

  c = getc(f);
  while (c != '"')
  {
    fprintf(g, "%c", c);
    c = getc(f);
  }
  fprintf(g, ",");

  //afisare urmatoarele chei
  do
  {
    c = getc(f);

    while (c != ',')
    {
      c = getc(f);
      if (c == '}')
      {
        flag = 1;
        break;
      }
    }
    if (flag)
      break;
    c = getc(f);
    while (c != '"')
      c = getc(f);
    c = getc(f);
    while (c != '"')
    {
      fprintf(g, "%c", c);
      c = getc(f);
    }
    fprintf(g, ",");
  }
  while (c != '}');
}
void get_values(FILE* f, FILE* g)
{
  long int valuenr = 0, nrkeys;

  char c;
  nrkeys = get_nrkeys(f);
  fseek(f, 0, SEEK_SET);
  c = getc(f);
  while (c != ']')
  {
    if (c == ':')
    {
      valuenr++;
      print_value(f,g);
      if (valuenr % nrkeys == 0)
        fprintf(g, "\n");
    }
    c = getc(f);
  }
  
}
int main(void)
{
    FILE *f, *g;
    
       
   // start = clock();
    
    f = fopen("convertor.in", "rt");
    g = fopen("convertor.out", "wt");
    //printf("%d\n", get_nrkeys(f));
    afisare_chei(f,g);
    fprintf(g, "\n");
    get_values(f,g);
    //get_dots_positions(f,g,0);
    
    fclose(f);
    fclose(g);
    //stop = clock();
    //printf("%.6f\n", (double)(stop - start) / CLOCKS_PER_SEC);
    return 0;
    
}