Files
Laboratori-TDP/Laboratorio 5/ricodifica.c
2024-03-22 17:14:57 +01:00

95 lines
2.0 KiB
C

// Laboratorio 5 - Esercizio 2
// Matteo Schiff - s295565
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#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;
}