// Laboratorio 5 - Esercizio 2 // Matteo Schiff - s295565 #include #include #include #define MAX_SIZE 30 #define MAX_LEN 200 typedef struct Coppia { int codice; int len; char sequenza[MAX_LEN]; } coppia; int caricaDizionario(coppia coppie[MAX_SIZE], int * c); int caricaDizionario(coppia coppie[MAX_SIZE], int * c) { FILE *fp_read; if ((fp_read = fopen("./dizionario.txt", "r")) == NULL) { printf("Errore nell'apertura del file\n"); return 1; } fscanf(fp_read, "%d\n", c); if (*c >= MAX_SIZE) { printf("Troppi elementi nel dizionario"); fclose(fp_read); return 1; } for (int i = 0; i < *c; i++) { fscanf(fp_read, "$%d$ %200s\n", &coppie[i].codice, coppie[i].sequenza); coppie[i].len = strlen(coppie[i].sequenza); } fclose(fp_read); return 0; } int main() { FILE *fp_read, *fp_write; char riga[MAX_LEN], buf[MAX_LEN]; bool richiedeCiclo; int c, w; coppia coppie[MAX_SIZE]; if (caricaDizionario(coppie, &c)) { return 1; } if ((fp_read = fopen("./sorgente.txt", "r")) == NULL) { printf("Errore nell'apertura del file\n"); return 1; } if ((fp_write = fopen("./ricodificato.txt", "w")) == NULL) { printf("Errore nell'apertura del file\n"); return 2; } while (!feof(fp_read)) { fgets(riga, 200, fp_read); for (int i = 0; i < c; i++) { richiedeCiclo = true; while (richiedeCiclo) { richiedeCiclo = false; char * ptr = strstr(riga, coppie[i].sequenza); if (ptr != NULL) { strcpy(buf, ptr); w = sprintf(ptr, "$%d$", coppie[i].codice); strcpy(ptr + w, buf + coppie[i].len); richiedeCiclo = true; } } } fprintf(fp_write, "%s", riga); } fclose(fp_read); fclose(fp_write); return 0; }