In questa lezione implementeremo il cifrario di Cesare da file.
Nella scorsa lezione abbiamo implementato semplicemente l’algoritmo per il cifrario di Cesare inserendo un testo da tastiera lungo massimo 100 caratteri, potete consultare la lezione al link: il cifrario di Cesare in C.
Oggi ci occuperemo invece di scrivere un programma che simuli il cifrario di Cesare sia per il mittente che per il destinatario.
Il testo è salvato in un file, ad esempio di nome testo.txt. Il mittente, dopo averlo cifrato lo salva in un altro file di testo di nome testocifrato.txt.
Il destinatario legge il file testocifrato.txt, decifra il messaggio e lo salva nel file testodecifrato.txt.
Per semplicità consideriamo il messaggio senza spazi vuoti, senza accenti, senza punteggiatura, lungo 14 caratteri e tutto in maiuscolo.
Immaginiamo dunque che nel file di testo ci sia scritto CODINGCREATIVO. Questo è dunque il testo che deve essere cifrato in base alla chiave digitata in input dal mittente.
Sviluppiamo quindi le seguenti funzioni:
void stampaAlfabeto(int c);
Si occupa di stampare l’alfabeto cifrato in base alla chiave fornita in input.
void messCifrato(char testo[n],int c);
Si occupa di cifrare la frase presa in input in base alla chiave fornita in input.
void messDecifrato(char testo[n],int c);
Si occupa di decifrare la frase presa in input in base alla chiave fornita in input.
Ecco l’algoritmo per il cifrario di Cesare da file:
#include <stdio.h>
#define n 14
void stampaAlfabeto(int c);
void messCifrato(char testo[n],int c);
void messDecifrato(char testo[n],int c);
int main(int argc, char *argv[]) {
int c,i;
char testo[n+1];
FILE *input;
FILE *input2;
do {
printf("--> MITTENTE\n\tInserisci la chiave: ");
scanf("%d",&c);
} while(c<=0 || c>26);
stampaAlfabeto(c); //stampa il nuovo alfabeto
input=fopen("Testo.txt","r"); //apriamo il file in lettura
fscanf(input,"%s",testo);
fclose(input);
printf("\tTesto in chiaro letto da file: %s\n", testo);
messCifrato(testo,c);
printf("\n-->DESTINATARIO \n");
input2=fopen("TestoCifrato.txt","r");
fscanf(input2,"%s",testo);
fclose(input2);
printf("\tTesto cifrato letto dal file : %s\n", testo);
messDecifrato(testo,c);
printf("\n");
return 0;
}
void stampaAlfabeto(int c) {
int i, cont=65;
char cifrato[26];
printf("\tAlfabeto cifrato con chiave %d: \n\t", c);
for(i=0;i<26-c;i++) {
cifrato[i]=cont+c;
printf("%c ",cifrato[i]);
cont++;
}
printf("\n\n");
}
void messCifrato(char testo[n+1],int c) {
int i;
FILE *output;
for(i=0;i<n;i++)
if(testo[i]<'Z'-c)
testo[i]+=c;
else
testo[i]='A'+c-('Z'-testo[i])-1;
printf("\n");
output=fopen("TestoCifrato.txt","w"); //apro il file
fprintf(output,"%s",testo);
fclose(output);
printf("\tTesto cifrato scritto su file: %s\n", testo);
}
void messDecifrato(char testo[n+1],int c) {
int i;
FILE *output2;
for(i=0;i<n;i++)
if(testo[i]<'A'+c)
testo[i] = 'Z'-(c-(testo[i]-'A')-1);
else
testo[i]-=c;
output2=fopen("TestoDecifrato.txt","w");
fprintf(output2,"%s",testo);
fclose(output2);
printf("\tTesto decifrato scritto su file: %s\n", testo);
}
Alcuni link utili
Allocazione dinamica della memoria con malloc
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Come sommare gli elementi della cornice esterna
Ricerca elementi in una matrice