从配置文件中读取标识符,把公式中字母后的数字提取出来

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


#define bool char
#define true 1
#define false 0


typedef struct pair {
  char key[24];
  double value;
} Pair;


typedef struct data {
  Pair *arr;
  size_t size;
} Data;


  // 得到所有key并关闭配置文件
size_t getConfig(char ***ppstr, FILE *fpconfig)
{
  char temp[100];
  size_t count = 0, size = 16;
  (*ppstr) = (char**)malloc(sizeof(char*)*size);
  if (*ppstr == NULL)
  {
    perror("*ppstr  malloc fail");
    exit(1);
  }
  while (EOF != fscanf(fpconfig, " %s", temp))
  {
    char *ptemp = (char*)malloc(sizeof(char)*(strlen(temp)+1));
    if (ptemp == NULL)
    {
      perror("ptemp  malloc fail");
      exit(1);
    }
    strcpy(ptemp, temp);
    if (count >= size)
    {
      (*ppstr) = (char**)realloc(*ppstr, (size*=2)*sizeof(char*));
      if (*ppstr == NULL)
      {
        perror("*ppstr  realloc fail");
        exit(1);
      }
    }
    (*ppstr)[count++] = ptemp;
  }
  (*ppstr) = (char**)realloc(*ppstr, count*sizeof(char*));
  if (*ppstr == NULL)
  {
    perror("*ppstr  realloc fail");
    exit(1);
  }
  return count;
}


bool findKey(char **keys, size_t size, char *tag)
{
int i = 0;//////////////////
  for (i = 0; i < size; ++i)
  {
    if (0 == strcmp(keys[i], tag))////////////////////////
      return true;
  }
  return false;



    // 得到数据
void getData(char *str, Data *pdata, char **keys, size_t keySize)
{
  Pair temp;
  char *pstr = strtok(str, " "), buff[32]="";//////////////
  if (pdata == NULL) return;
  size_t size = 8, count = 0;
  pdata->arr = (Pair*)malloc(sizeof(Pair)*size);
  if (pdata->arr == NULL)
  {
    perror("pdata->arr  malloc fail");
    exit(1);
  }
  while (pstr)
  {
      sscanf(pstr, " %[^1234567890-.]%lf", temp.key, &temp.value);
      if (true == findKey(keys, keySize, temp.key))
      {
        if (count >= size)
        {
          pdata->arr = (Pair*)realloc(pdata->arr, sizeof(Pair) * (size*=2));
          if (pdata->arr == NULL)
          {
            perror("pdata->arr  realloc fail");
            exit(1);
          }
        }
        pdata->arr[count++] = temp;
        // printf("\"%s\":%g  ", pdata->arr[count-1].key, pdata->arr[count-1].value);
      }
      pstr = strtok(NULL, " ");
  }
  pdata->arr = (Pair*)realloc(pdata->arr, sizeof(Pair)*count);
  if (pdata->arr == NULL)
  {
    perror("pdata->arr  realloc fail");
    exit(1);
  }
  pdata->size = count;
}


  // 填充所有缺省数据
void completion(Data *datas, size_t size)
{
int i = 0;////////////////
int j;
int k;////////////////////
  for (i = 1; i < size; ++i)
  {
    if (datas[i].size == datas[i-1].size)
      continue;
    
    Pair *newarr = (Pair*)malloc(sizeof(Pair)*datas[i-1].size);
    if (newarr == NULL)
    {
      perror("newarr  malloc fail");
      exit(1);
    }////////////////
    for (j = 0, k = 0; j < datas[i-1].size; ++j)
    {
      if (!strcmp(datas[i-1].arr[j].key, datas[i].arr[k].key))
      {
        newarr[j] = datas[i].arr[k];
        k++;
      } else {
        newarr[j] = datas[i-1].arr[j];
      }
    }
    free(datas[i].arr);
    datas[i].arr = newarr;
    datas[i].size = datas[i-1].size;
  }
  
}


void fputdatas(FILE *fpout, Data *datas, size_t size)
{
int i,j;////////////////////
  for (i = 0; i < size; ++i)
  {
    for (j = 0; j < datas[i].size; ++j)/////////////
    {
      //fprintf(fpout, "\"%s\":%g  ", datas[i].arr[j].key,datas[i].arr[j].value);//datas[i].arr[j].key
      fprintf(fpout, "%g.0  ",datas[i].arr[j].value);//datas[i].arr[j].key             //change words numbers
    }
    fputc('\n', fpout);
  }
  
}


int main()
{
  int i ;////////////////
  char str[100] = {0}, *pstr = str, buff[100] = {0};
  char **keys = NULL;
  size_t keySize = 0;
  FILE *fpin = NULL, *fpout = NULL, *fpconfig = NULL;
  Data data, *datas = NULL;
  size_t size = 8, count = 0;
  
  // 打开所有文件
  if ((fpin = fopen("in.txt", "r")) == NULL
  || (fpout = fopen("out.txt", "w")) == NULL
  || (fpconfig = fopen("config.txt", "r")) == NULL)
  {
    perror("fopen fail!");
    return 1;
  }
  // 得到所有key并关闭配置文件
  keySize = getConfig(&keys, fpconfig);
  fclose(fpconfig);
  
  // 输出所有key
  // /////////////////////////////
 // puts("config:");
 puts("Success!!!");
  for (i = 0; i < keySize; ++i)////////////
   // printf("%s  ", keys[i]);
 // putchar('\n');
  
  // 为数据预先分配内存
  datas = (Data*)malloc(sizeof(Data)*size);
  if (datas == NULL)
  {
    perror("datas  malloc fail");
    exit(1);
  }
  //////////////////////
 // puts("\n\ninput:");
  while (fgets(str, 100, fpin))
  {
    //printf(str);
// printf("%s\n",str);///////////////////////////////////////
    // 如果装不下就重新分配更大的内存
    if (count >= size)
    {
      datas = (Data*)realloc(datas, sizeof(Data)*(size*=2));
      if (datas == NULL)
      {
        perror("datas  realloc fail");
        exit(1);
      }
    }
    // 得到数据
    getData(str, &datas[count++], keys, keySize);
    // putchar('\n');
  }
  // 裁剪多余内存
  datas = (Data*)realloc(datas, sizeof(Data)*count);
  if (datas == NULL)
  {
    perror("datas  realloc fail");
    exit(1);
  }
  // 填充所有缺省数据
  completion(datas, count);
 // puts("\n\nresult:");
  fputdatas(fpout, datas, count);//////////////fpout
  
  fclose(fpin);
  fclose(fpout);
  return 0;
}

猜你喜欢

转载自blog.csdn.net/idijsj/article/details/78905765
今日推荐