#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;
}
#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;
}