#include <stdio.h> typedef struct { char **array; int size; int allocSize; } ARR; int findOrAddArray(char *item, ARR *arr) { int i, k; int g 0, d arr->size-1; while ( g <= d ) { i = (g+d)/2; k = strcmp(item, arr->array[i]); if ( k == 0 ) return i; if ( k < 0 ) d = i-1; else g = i+1; } i = g; char ** p; if ( arr->size == 0 ) { p = (char **) malloc(sizeof(char *)*arr->allocSize); p[0] = malloc(strlen(item)+1); strcpy(p[0], item); arr->array = p; } else if ( arr->size == arr->allocSize ) { arr->allocSize *= 2; p = (char **) malloc(sizeof(char *)*arr->allocSize); if ( i > 0 ) memcpy(p, arr->array, sizeof(char *)*i); p[i] = malloc(strlen(item)+1); strcpy(p[i], item); if ( i < arr->size ) memcpy(&p[i+1], &arr->array[i], sizeof(char *)*(arr->size-i)); free(arr->array); arr->array = p; } else { p = (char **) malloc(sizeof(char *)*arr->allocSize); if ( i > 0 ) memcpy(p, arr->array, sizeof(char *)*i); p[i] = malloc(strlen(item)+1); strcpy(p[i], item); if ( i < arr->size ) memcpy(&p[i+1], &arr->array[i], sizeof(char *)*(arr->size-i)); free(arr->array); arr->array = p; } arr->size++; return i; } main(int argc, char *argv[]) { if(argc!=2) { printf("Il manque un nom de fichier en argument ! \n"); return 1; } FILE *fp, *fpo; ARR tag; ARR gsm; tag.size = 0; tag.allocSize = 2000; gsm.size = 0; gsm.allocSize = 500; char bufTag[512], bufGsm[512]; char prevTag[512]; int freq; int i, j; fp = fopen(argv[1],"r"); if(fp == NULL) { printf("Cant open %s \n", argv[1]); return 2; } fpo = fopen("xxxx", "w"); prevTag[0] = 0; while ( !feof(fp) ) { if ( fscanf(fp, "%s %s %d", bufGsm, bufTag, &freq) == 3 ) { i = findOrAddArray(bufTag, &tag); j = findOrAddArray(bufGsm, &gsm); fprintf(fpo, "%d %d %d\n", i, j, freq); } } fclose(fp); fclose(fpo); int *res = (int*)malloc(tag.size*gsm.size*sizeof(int)); fp = fopen("xxxx","r"); /* temporaire */ while ( !feof(fp) ) { if ( fscanf(fp, "%d %d %d", &i, &j, &freq) == 3 ) { res[i*gsm.size+j] = freq; } } fclose(fp); fpo = stdout; fprintf(fpo, "etiquette"); for (j=0; j<gsm.size; j++) { fprintf(fpo, " %s", gsm.array[j]); } fprintf(fpo, "\n"); for (i=0; i<tag.size; i++) { fprintf(fpo, "%s", tag.array[i]); for (j=0; j<gsm.size; j++) { fprintf(fpo, " %d", res[i*gsm.size+j]); } fprintf(fpo, "\n"); } free(res); for (i=0; i<tag.size; i++) free(tag.array[i]); free(tag); for (i=0; i<gsm.size; i++) free(gsm.array[i]); free(gsm); }
#include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char **array; int size; int allocSize; int lastIndex; char * lastFind; } ARR; void initArray(ARR* a, int sz) { a->size = 0; a->allocSize = sz; a->array = (char **) malloc(sizeof(char *) * sz); a->lastIndex = -1; a->lastFind = (char *)0; } int findOrAddArray(ARR *arr, char *item) { if ( arr->lastFind && !strcmp(item, arr->lastFind) ) return arr->lastIndex; int i, k; int g 0, d arr->size-1; while ( g <= d ) { i = (g+d)/2; k = strcmp(item, arr->array[i]); if ( k == 0 ) { arr->lastFind = arr->array[i]; arr->lastIndex = i; return i; } if ( k < 0 ) d = i-1; else g = i+1; } i = g; if ( arr->size == arr->allocSize ) arr->allocSize *= 2; char ** p = (char **) malloc(sizeof(char *) * arr->allocSize); if ( i > 0 ) memcpy(p, arr->array, sizeof(char *) * i); p[i] = malloc(strlen(item) + 1); strcpy(p[i], item); if ( i < arr->size ) memcpy(&p[i+1], &arr->array[i], sizeof(char *) * (arr->size-i)); free(arr->array); arr->array = p; arr->size++; arr->lastFind = arr->array[i]; arr->lastIndex = g; return i; } main(int argc, char *argv[]) { FILE *fp, *fpo; ARR tag; ARR gsm; initArray(&tag, 2000); initArray(&gsm, 500); if ( argc != 2 ) { fprintf(stderr, "il manque le fichier à traiter."); exit(1); } char bufTag[512], bufGsm[512]; int freq; int i, j; if ( !(fp = fopen(argv[1],"r")) ) { fprintf(stderr, "%s: erreur d'ouverture"); exit(1); } struct stat st; stat(argv[1], &st); long fsz = st.st_size; fprintf(stderr, "size = %d\n", fsz); fpo = fopen("xxxx", "w"); int n = 1; while ( !feof(fp) ) { if ( fscanf(fp, "%s %s %d", bufGsm, bufTag, &freq) == 3 ) { i = findOrAddArray(&tag, bufTag); j = findOrAddArray(&gsm, bufGsm); fprintf(fpo, "%d %d %d\n", i, j, freq); } if ( fsz > 0 && ftell(fp)*100.0/fsz > n ) { fprintf(stderr, "%d %%\r", n++); fflush(stderr); } } fprintf(stderr, "100 %%\n"); fclose(fp); fclose(fpo); /*************************************/ int *res = (int*)malloc(tag.size * gsm.size * sizeof(int)); fp = fopen("xxxx","r"); while ( !feof(fp) ) { if ( fscanf(fp, "%d %d %d", &i, &j, &freq) == 3 ) res[i*gsm.size+j] = freq; } fclose(fp); /*************************************/ fpo = stdout; fprintf(fpo, "etiquette"); for (j=0; j<gsm.size; j++) fprintf(fpo, " %s", gsm.array[j]); fprintf(fpo, "\n"); for (i=0; i<tag.size; i++) { fprintf(fpo, "%s", tag.array[i]); for (j=0; j<gsm.size; j++) fprintf(fpo, " %d", res[i*gsm.size+j]); fprintf(fpo, "\n"); } for (i=0; i<tag.size; i++) free(tag.array[i]); free(tag.array); for (i=0; i<gsm.size; i++) free(gsm.array[i]); free(gsm.array); free(res); }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questioni = findOrAddArray(&tag, bufTag); j = findOrAddArray(&gsm, bufGsm); // fprintf(fpo, "%d %d %d\n", i, j, freq); ... /* int *res = (int*)malloc(tag.size * gsm.size * sizeof(int)); fp = fopen("xxxx","r"); while ( !feof(fp) ) { if ( fscanf(fp, "%d %d %d", &i, &j, &freq) == 3 ) res[i*gsm.size+j] = freq; } fclose(fp); ... jusque là, attention aux commentaires intérieurs */ for (i=0; i<tag.size; i++) free(tag.array[i]); free(tag.array); for (i=0; i<gsm.size; i++) free(gsm.array[i]); free(gsm.array); free(res); }
#include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "hashtable.h" typedef struct { char **array; int size; int allocSize; struct hashtable *h; } ARR; typedef struct { long i; long j; long freq; } FREQ; typedef struct st_bloc { FREQ tbfreq[1024]; int n; struct st_bloc *next; } BLOC; static unsigned int hashKey(void* item) { unsigned int h = 0; char *p = (char *)item; while ( *p ) { h = ((h << 5) + h) + *p++; } return h; } static int compareKey(void* k1, void* k2) { return !strcmp(k1, k2); } void initArray(ARR* a, int sz, int hsz) { a->size = 0; a->allocSize = sz; a->array = (char **) malloc(sizeof(char *) * sz); a->h = create_hashtable(hsz, hashKey, compareKey); } long findOrAddArray(ARR *arr, char *item) { long * pi = (long *)hashtable_search(arr->h, item); if ( pi ) { return *pi; } long i = arr->size; int n = strlen(item); char * key = malloc(n + 1 + sizeof(long)); strcpy(key, item); pi = (long *)(&key[n + 1]); *pi = i; if ( arr->size == arr->allocSize ) { arr->allocSize *= 2; char ** p = (char **) malloc(sizeof(char *) * arr->allocSize); memcpy(p, arr->array, sizeof(char *) * arr->size); free(arr->array); arr->array = p; } arr->array[i] = key; arr->size++; hashtable_insert(arr->h, key, pi); return i; } BLOC* empile(BLOC *b, long i, long j, long freq) { if ( !b ) { b = (BLOC *)malloc(sizeof(BLOC)); b->n = 0; b->next = 0; } else if ( b->n == sizeof(b->tbfreq)/sizeof(FREQ) ) { BLOC *x = b; b = (BLOC *)malloc(sizeof(BLOC)); b->next = x; b->n = 0; } FREQ* pf = &b->tbfreq[ b->n++ ]; pf->i = i; pf->j = j; pf->freq = freq; return b; } BLOC* depile(BLOC *b, long *i, long *j, long * freq) { if ( !b ) return NULL; if ( b->n > 0 ) { FREQ* pf = &b->tbfreq[ --b->n ]; *i = pf->i; *j = pf->j; *freq = pf->freq; } else { BLOC *x = b->next; free(b); b = depile(x, i, j, freq); } return b; } main(int argc, char *argv[]) { BLOC *blk = NULL; FILE *fp; ARR tag; ARR gsm; initArray(&tag, 10000, 1000000); initArray(&gsm, 500, 1000); if ( argc != 2 ) { fprintf(stderr, "il manque le fichier à traiter."); exit(1); } char bufTag[512], bufGsm[512]; long freq; long i, j; if ( !(fp = fopen(argv[1],"r")) ) { fprintf(stderr, "%s: erreur d'ouverture"); exit(1); } struct stat st; stat(argv[1], &st); long fsz = st.st_size; fprintf(stderr, "size = %d\n", fsz); float n = 0.1; while ( !feof(fp) ) { if ( fscanf(fp, "%s %s %d", bufGsm, bufTag, &freq) == 3 ) { i = findOrAddArray(&tag, bufTag); j = findOrAddArray(&gsm, bufGsm); blk = empile(blk, i, j, freq); } if ( fsz > 0 && ftell(fp)*100.0/fsz > n ) { fprintf(stderr, "%.1f%% tag:%d gsm:%d\r", n,tag.size,gsm.size); fflush(stderr); n += 0.1; } } fprintf(stderr, "100.0%% tag:%d gsm:%d\r", tag.size,gsm.size); fclose(fp); /*************************************/ long *res = (long*)malloc(tag.size * gsm.size * sizeof(long)); while ( blk = depile(blk, &i, &j, &freq) ) res[i*gsm.size+j] = freq; /*************************************/ FILE *fpo = stdout; fprintf(fpo, "etiquette"); for (j=0; j<gsm.size; j++) fprintf(fpo, " %s", gsm.array[j]); fprintf(fpo, "\n"); for (i=0; i<tag.size; i++) { fprintf(fpo, "%s", tag.array[i]); for (j=0; j<gsm.size; j++) fprintf(fpo, " %d", res[i*gsm.size+j]); fprintf(fpo, "\n"); } hashtable_destroy(tag.h, 0); free(tag.array); hashtable_destroy(gsm.h, 0); free(gsm.array); free(res); }
/*************************************/ //long *res = (long*)malloc(tag.size * gsm.size * sizeof(long)); long **res = (long **)calloc(tag.size, sizeof(long *)); for (i = 0; i < tag.size; i++) { res[i] = (long *)calloc(gsm.size, sizeof(long)); } while ( blk = depile(blk, &i, &j, &freq) ) res[i][j] = freq; /*************************************/
for (j=0; j<gsm.size; j++) fprintf(fpo, " %d", res[i][j]);
for (i = 0; i < tag.size; i++) free(res[i]); free(res);