Concetti Chiave
- Il programma C legge un file di testo e sostituisce sequenze speciali di lettere maiuscole racchiuse tra parentesi quadre con valori numerici corrispondenti.
- Le corrispondenze tra lettere e numeri sono memorizzate in un file separato, facilitando l'aggiornamento delle sostituzioni senza modificare il codice.
- Il programma gestisce errori di apertura dei file, garantendo che l'utente venga avvisato se un file non può essere aperto.
- Le sostituzioni avvengono in un ciclo che legge caratteri uno per uno, identificando le sequenze speciali e stampando i valori numerici appropriati.
- La funzione 'leggiTabella' si occupa di popolare un array con i valori numerici letti dal file delle corrispondenze, utilizzando la lettera come indice.
Un file contiene un testo in cui possono apparire delle sequenze speciali composte da una lettera maiuscola racchiusa tra parentesi quadre (v. il file testo.txt come esempio). Un secondo file (può essere utile trasferirlo in memoria centrale, v. esempio tabella.txt) contiene la corrispondenza tra lettere maiuscole e numeri interi. Scrivere un programma C che produca sul file standard di output il testo del primo file sostituendo a ciascuna sequenza speciale il corrispondente valore numerico. Si supponga che non ci siano caratteri di una sequenza speciale non presenti nel file delle corrispondenze e che il testo non contenga i caratteri [‘ e ‘] se non nelle sequenze speciali suddette.
File testo.txt
Il treno delle [H] e [M] porta un ritardo di [R] minuti. Chissà se mi
rimborseranno i [E],[C] euro del biglietto? Il giorno [G]/[M]/2007 ci
sarà un’altra riunione alle [A].
File tabella.txt
Descrizione del file tabella.txt
A 11
G 23
E 14
M 12
C 50
H 17
R 35
Output
Il treno delle 17 e 12 porta un ritardo di 35 minuti. Chissà se mi
rimborseranno i 14,50 euro del biglietto? Il giorno 22/12/2007 ci
sarà un’altra riunione alle 11.
int main()
{
int tabella[26];
FILE *fpTesto;
FILE *fpTabella;
char car;
leggiTabella(tabella);
fpTesto=fopen("testo.txt","rt");
if (!fpTesto)
{
printf("Errore: il file contenente il testo da sostituire non
può venire aperto.\n");
exit(1);
}
while ((car=fgetc(fpTesto))!=EOF)
{
if (car == '[')
{
car=fgetc(fpTesto);
printf("%d",tabella[car-'A']);
car=fgetc(fpTesto); // leggo e ignoro la parentesi
//quadra chiusa
}
else printf("%c",car);
}
fclose(fpTesto);
getchar();
}
void leggiTabella (int tabella [])
{
FILE *fpTabella;
char lettera[2];
int num;
fpTabella=fopen("tabella.txt","rt");
if (!fpTabella)
{
printf("Errore: il file tabella non puo' venire aperto.\n");
exit(1);
}
while (fscanf(fpTabella,"%s%d",lettera,&num)!=EOF)
{
tabella[lettera[0]-'A'] = num;
}
fclose(fpTabella);
}
Domande da interrogazione
- Come funziona il programma per sostituire le sequenze speciali nel testo?
- Qual è la struttura dei file utilizzati dal programma?
- Cosa succede se il programma non riesce ad aprire uno dei file?
Il programma legge un file di testo e sostituisce le sequenze speciali, composte da lettere maiuscole tra parentesi quadre, con i corrispondenti valori numerici prelevati da un secondo file di corrispondenza.
Il file "testo.txt" contiene il testo con le sequenze speciali, mentre "tabella.txt" contiene le corrispondenze tra lettere maiuscole e numeri interi, con ogni riga formata da una lettera seguita da un numero.
Se il programma non riesce ad aprire il file di testo o il file di corrispondenza, stampa un messaggio di errore e termina l'esecuzione.